Tag: closures

Javascriptclosures和'这个'

我创build的对象有一个问题,如下所示: var myObject = { AddChildRowEvents: function(row, p2) { if(document.attachEvent) { row.attachEvent('onclick', function(){this.DoSomething();}); } else { row.addEventListener('click', function(){this.DoSomething();}, false); } }, DoSomething: function() { this.SomethingElse(); //<– Error here, object 'this' does not support this method. } } 问题是,当我在“DoSomething”函数内部时,“this”没有引用“myObject”,我做错了什么?

(…())与(…)()在JavaScriptclosures

我知道这很愚蠢,但是这有什么区别: (function() { var foo = 'bar'; })(); 和这个? (function() { var foo = 'bar'; }()); JSLint告诉我们Move the invocation into the parens that contain the function ,但是我不需要。 编辑:答案太酷了。 ~function , JSHint替代scheme以及jQuery对(/***/)();的偏好(/***/)(); 和克罗克福德的解释! 我以为我会得到一个“他们是同样的东西”的答案。 你们通过upvotes决定最好的一个,我打勾。

Python 2.x中的非本地关键字

我试图在Python 2.6中实现一个闭包,我需要访问一个非本地variables,但似乎这个关键字在python 2.x中不可用。 在这些版本的python中,应该如何访问非本地variables?

closuresvariables捕获的详细说明

我已经看到无数的post,关于variables捕获如何在创build闭包时引入variables,但是他们似乎都没有详细说明具体的细节,并称之为“编译器魔术”。 我正在寻找一个明确的解释: 如何实际捕获本地variables。 捕获值types与参考types之间的差异(如果有的话)。 是否有价值types的拳击发生。 我的偏好是用价值观和指针(更接近内部发生的事情的核心)来回答,尽pipe我会接受一个涉及价值和参考的明确答案。

JavaScript不支持使用局部variables的闭包?

这个代码我很困惑: var closures = []; function create() { for (var i = 0; i < 5; i++) { closures[i] = function() { alert("i = " + i); }; } } function run() { for (var i = 0; i < 5; i++) { closures[i](); } } create(); run(); 从我的理解应该打印0,1,2,3,4(这不是封闭的概念?)。 相反,它打印5,5,5,5,5。 我试过Rhino和Firefox。 有人可以向我解释这种行为吗? Thx提前。

如何从C#closures计算机

从C#程序closures计算机的最佳方法是什么? 我发现了一些可行的方法 – 我会在下面发表 – 但是没有一个很优雅。 我正在寻找更简单的本地.net。

Python lambdaclosures范围

我试图使用闭包来消除函数签名中的variables(应用程序是编写连接接口的Qt信号所需的所有函数,以控制大量参数到存储值的字典)。 我不明白为什么使用不包含在另一个函数lambda的情况下返回所有情况下的姓氏。 names = ['a','b','c'] def test_fun(name,x): print name,x def gen_clousure(name): return lambda x: test_fun(name,x) funcs1 = [gen_clousure(n) for n in names] funcs2 = [lambda x: test_fun(n,x) for n in names] # this is what I want In [88]: for f in funcs1: ….: f(1) a 1 b 1 c 1 # I do not […]

JavaScriptclosures与匿名函数

我和我的一个朋友正在讨论什么是JS的封闭,什么不是。 我们只是想确保我们确实正确地理解它。 我们来看一下这个例子。 我们有一个计数循环,并希望在控制台上延迟打印计数器variables。 因此,我们使用setTimeout和closures来捕获计数器variables的值,以确保它不会打印N倍N值。 没有closures或任何closuresclosures的错误解决scheme将是: for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 1000); } 这当然会打印10次循环后的i值,即10。 所以他的尝试是: for(var i = 0; i < 10; i++) { (function(){ var i2 = i; setTimeout(function(){ console.log(i2); }, 1000) })(); } 按预期打印0到9。 我告诉他,他没有用封口来抓i ,但他坚持说他是。 我certificate了他没有使用闭包 ,把for循环体放入另一个setTimeout (将匿名函数传给setTimeout ),再次打印10次。 如果我将它的函数存储在一个var并在循环之后执行,同样也适用于10次打印。10因此,我的观点是他并没有真正捕捉到i的值 ,使得他的版本不是闭包。 我的尝试是: for(var i […]

内存泄漏风险在JavaScriptclosures

解决了 关于这个问题,networking上有很多矛盾的信息。 感谢@John,我设法解决了closures(如下面所使用的)不是内存泄漏的原因,即使在IE8中,它们也不像人们声称的那样常见。 事实上,在我的代码中只发生了一次泄漏,事实certificate这并不难解决。 从现在起,我对这个问题的回答是: AFAIK,唯一一次IE8泄漏,是事件被附加/处理程序设置在全局对象上。 ( window.onload , window.onbeforeunload ,…)。 为了解决这个问题,请参阅下面的答案。 巨大的更新: 我现在完全失去了…经过一段时间的挖掘,新旧文章,我留下了至less一个巨大的矛盾。 虽然JavaScript大师之一(道格拉斯·克罗克福德)说: 由于IE无法完成工作并回收周期,因此我们需要这样做。 如果我们明确地打破周期,那么IE将能够回收内存。 据微软称,closures是导致内存泄漏的原因。 这当然是非常错误的,但是这会导致微软给程序员提出非常糟糕的build议,说明如何应对微软的错误。 事实certificate,很容易打破在DOM方面的周期。 在JScript方面几乎是不可能的。 正如@freakish指出,我的下面的代码片段类似于jQuery的内部工作,我觉得我的解决scheme非常安全,不会导致内存泄漏。 同时,我find了这个MSDN页面 ,其中“ Circular References with Closures ”一节对我特别感兴趣。 下图几乎是我的代码如何工作的示意图,是不是: 唯一的区别是,我没有把我的事件监听器附加到元素本身的常识。 所有相同的Douggie是非常明确的:闭包不是IE中的mem漏洞的来源。 这个矛盾让我无法确定谁是对的。 我也发现泄漏问题在IE9中也没有完全解决(无法find链接ATM)。 最后一件事 :我也学会了IE在JScript引擎之外pipe理DOM,当我根据ajax请求更改<select>元素的子元素时,这让我有点麻烦: function changeSeason(e) { var xhr,sendVal,targetID; e = e || window.event;//(IE… targetID = this.id.replace(/commonSourceFragment/,'commonTargetFragment');//fooHomeSelect -> barHomeSelect sendVal = this.options[this.selectedIndex].innerHTML.trim().substring(0,1); xhr […]

调用直接分配给对象属性的闭包

我希望能够直接调用一个闭包给对象的属性,而不必将闭包重新指派给一个variables,然后调用它。 这可能吗? 下面的代码不起作用,并导致Fatal error: Call to undefined method stdClass::callback() 。 $obj = new stdClass(); $obj->callback = function() { print "HelloWorld!"; }; $obj->callback();