在你不知道Javascript系列中,1/3的生活方式被描述为不是闭包本身,但前提是它们在词汇范围之外执行:
第三章介绍了生命模式。虽然人们常说生活(只有生命)是观察到的结束的一个例子,但根据我们上面的定义,我有些不同意。 此代码“工作”,但严格来说并不是对闭包的观察。为什么?因为函数(我们在这里将其命名为"IIFE“)不是在其词法范围之外执行的。它仍然在声明的相同作用域(也包含a的封闭/全局范围)中被调用。A是通过正常的词汇范围查找找到的,而不是通过闭包找到的.
var a = 2;
(function IIFE(){ // not actually a "closure"
console.log( a );
})();在这个所以贴中,给出了以下片段作为闭包的示例:
for (var i = 0; i < someVar.length; i++)
(function (i) {
window.setTimeout(function () {
alert("Value of i was "+i+" when this timer was set" )
}, 10000);
})(i); 我试图从闭包的定义(如这篇媒体文章中的定义)来理解这一点:
要使用闭包,只需在另一个函数中定义一个函数并公开它。若要公开一个函数,请返回它或将它传递给另一个函数。..。 即使在外部函数返回之后,内部函数也可以访问外部函数作用域中的变量。
我知道闭包是一个“有状态函数”,而且它是。
一种“记住”并继续访问函数的作用域(其变量)的方法,即使该函数已经运行完毕。
所以在这个例子中,我看到循环的i在传递到关闭生命中时会被记住。
我的问题是:
“传递到另一个函数或返回”部分在哪里发生?我的猜测是,IIFE能够在每次迭代时记住外部i的循环值,因为IIFE被传递到窗口?
基本上,我的理解是,闭包被定义为在垃圾收集器清除外部作用域之后记住外部作用域的值,并且它的用法是通过返回闭包并在其词法作用域之外访问它来公开闭包。这是正确的吗?那么“在词法范围之外访问它”是在哪里发生的呢?
发布于 2017-07-17 20:57:46
在本例中,我看到循环的
i在传递到关闭生命中时会被记住
不是的。生命只是提供了要记住的i值的范围。正如你引用的话状态,生命函数不是一个闭包。使用i的函数表达式是闭包:
(function IIFE(i) {
// this is the scope of i
window.setTimeout(function closure() {
// this function closes over i
alert("Value of my local 'i' is still "+i+" even after 10 seconds");
}, 10000);
})(0);
// ^ this is some arbitrary value passed to the IIFE - it could have been a loop variable“传递到另一个函数或返回”部分在哪里发生?
这是传递给closure的setTimeout函数,它将从通常不再定义i的地方调用它--如果不是闭包的话。
https://stackoverflow.com/questions/45151381
复制相似问题