考虑这个脚本:
function Obj(prop) {
this.prop = prop;
}
var NS = {
strings: ['first','second','third'],
objs: [],
f1: function() {
for (s in this.strings) {
var obj = new Obj(this.strings[s]);
obj.f2 = function() {
alert(obj.prop);
}
this.objs.push(obj);
}
}
}
NS.f1();
NS.objs[0].f2(); // third
NS.objs[1].f2(); // third
NS.objs[2].f2(); // third
不完全是预期的输出,但是当我更新到这个时:
function Obj(prop) {
this.prop = prop;
}
var NS = {
strings: ['first','second','third'],
objs: [],
f1: function() {
for (s in this.strings) {
var obj = new Obj(this.strings[s]);
this.wire(obj); // replaces previous function def
this.objs.push(obj);
}
},
wire: function(obj) {
obj.f2 = function() {
alert(obj.prop);
} // exact same code and function def as the first example
}
}
NS.f1();
NS.objs[0].f2(); // first
NS.objs[1].f2(); // second
NS.objs[2].f2(); // third
这似乎有效,但我不知道为什么。有人可以启发我吗?谢谢
最佳答案
查看 http://jibbering.com/faq/notes/closures/ .
它将解释“其他内容”,并且可能是您想要了解的有关 JavaScript 变量和作用域如何工作的所有内容。 JavaScript 使用“执行上下文”闭包,而不是“词法变量”闭包(编辑:它仍然是词法绑定(bind),只是不一定如预期的那样 -- 见下文)。
在第一个示例中,相同 obj 被绑定(bind)了三次,或者更确切地说,相同的 obj 属性(编辑:规范没有不需要这个,但将其称为属性是一种解释方式)单绑定(bind)执行上下文是共享的!
var 不“声明”变量(编辑:它是一个适用于整个范围的注解,不受 {} 的影响,以下情况除外)和 函数 是如何引入新的作用域 -> 新的执行上下文(这就是第二个示例按预期工作的原因)。新作用域仅通过function(或eval/similar)引入。
快乐编码。
关于JavaScript:词法闭包还是其他?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020615/
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
我是Ruby的新手,有些闭包逻辑让我感到困惑。考虑这段代码:array=[]foriin(1..5)array[5,5,5,5,5]这对我来说很有意义,因为i被绑定(bind)在循环之外,所以每次循环都会捕获相同的变量。使用每个block可以解决这个问题对我来说也很有意义:array=[](1..5).each{|i|array[1,2,3,4,5]...因为现在每次通过时都单独声明i。但现在我迷路了:为什么我不能通过引入一个中间变量来修复它?array=[]foriin1..5j=iarray[5,5,5,5,5]因为j每次循环都是新的,我认为每次循环都会捕获不同的变量。例如,这绝对
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id
eruby和erb有什么区别?哪些考虑因素会促使我选择其中之一?我的应用程序正在为网络设备(路由器、负载平衡器、防火墙等)生成配置文件。我的计划是对配置文件进行模板化,在源文件中使用嵌入式ruby(通过eruby或erb)来执行诸如迭代生成路由器的所有接口(interface)配置block之类的操作(这些block都非常相似,仅在标签上有所不同和IP地址)。例如,我可能有这样一个配置模板文件:hostnamesample-routerlogging10.5.16.26当通过嵌入式ruby解释器(erb或eruby)运行时,会产生以下输出:hostnamesample-rout
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
我在Rails模型中有两列相互关联:Article.bodyArticle.body_updated_on每次Article.body更新时,我想将Article.body_updated_on更改为Time.now。如果任何其他字段已更新,则无需进行任何操作。 最佳答案 只需在将回调保存到您的文章模型之前添加classArticle 关于ruby-on-rails-RubyonRails,在更新其他列值时更改列值,我们在StackOverflow上找到一个类似的问题: