嘿,我在 youtube 上看到了这个视频 http://www.youtube.com/watch?v=KRm-h6vcpxs
基本上解释了 IIFE 和闭包。但我不明白的是我是否需要返回一个函数才能将其称为闭包。
例如
function a() {
var i = 10;
function b() {
alert(i);
}
}
在这种情况下,我可以将其称为闭包,因为它正在从外部函数的范围访问“i”变量,还是我需要像这样返回函数
return function b(){alert(i);}
最佳答案
闭包只是一个函数,它保持着它的词法环境,直到它自己死了才让它离开。
将闭包想象成守财奴叔叔:
史高治叔叔是个守财奴。他永远不会放弃他的钱。
同样,闭包也是一个守财奴。它不会放弃它的变量,直到它自己死去。
例如:
function getCounter() {
var count = 0;
return function counter() {
return ++count;
};
}
var counter = getCounter();
看到函数 counter 了吗? getCounter 函数返回的那个?该功能是一个守财奴。它不会放弃 count 变量,即使 count 变量属于 getCounter 函数调用并且该函数调用已经结束。因此,我们将 counter 称为闭包。
看到每个函数调用都可能创建变量。例如,调用 getCounter 函数会创建一个变量 count。现在这个变量 count 通常会在 getCounter 函数结束时消失。
但是 counter 函数(可以访问 count 变量)不允许它在调用 getCounter 结束时结束。这是因为 counter 函数需要 count。因此它只允许 count 在它自己死后死掉。
现在需要注意的真正有趣的事情是 counter 是在对 getCounter 的调用中产生的。因此,当对 getCounter 的调用结束时,甚至 counter 也应该死掉——但它没有。它甚至在调用 getCounter 结束后仍然存在,因为它脱离了 getCounter 的范围(生命周期)。
counter 可以通过多种方式逃脱getCounter 的范围。最常见的方法是让 getCounter 简单地返回 counter。然而,还有更多的方法。例如:
var counter;
function setCounter() {
var count = 0;
counter = function counter() {
return ++count;
};
}
setCounter();
这里 getCounter 的姊妹函数(恰本地称为 setCounter)将一个新的 counter 函数分配给全局 counter变量。因此,内部 counter 函数脱离了 setCounter 的范围,成为一个闭包。
实际上在 JavaScript 中每个函数都是一个闭包。然而,直到我们处理逃离父函数范围的函数时,我们才意识到这一点并且即使在对父函数的调用结束后,仍然保持属于父函数的一些变量仍然存在。
有关更多信息,请阅读此答案:https://stackoverflow.com/a/12931785/783743
关于javascript - 函数返回是否需要被称为闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586950/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查