【发布时间】:2014-01-10 19:46:40
【问题描述】:
我了解在定义函数时会创建范围。但是我不确定我是否正确理解变量值(在函数中定义并在内部函数中引用,又名闭包)是否也在定义嵌套函数时被捕获,或者,当它被执行时。
在循环场景中众所周知的闭包中,闭包似乎在循环结束时捕获了“i”值。假设循环 5 次,那么“i”就是 4。因此“i”会被捕获为 4。因此看起来“i”是仅在执行嵌套函数时才被捕获?
如果有人能指出捕获发生的位置,我们将不胜感激。
场景 1
var fnName = function(x){
return function(){ return ++x; }; // (is x value captured here?)
};
var fnName1 = fnName(0);
fnName1(); // x=1 (is x value captured here?)
fnName1(); // x=2
场景 2
var fnName = function(){
var x = 0;
return function(){ return ++x; }; // (is x value captured here?)
};
var fnName1 = fnName();
fnName1(); // x=1 (is x value captured here?)
fnName1(); // x=2
场景 3
var fnName = function(){
var x = 0;
function runFn(){ return x++; }; // (is x value captured here?)
runFn();
};
fnName(); // x=0
fnName(); // x=0
【问题讨论】:
-
要理解的关键是闭包不会关闭变量的值,它们会关闭变量。它们具有对实际变量的持久引用,而不是其在特定时间点的值。
-
@T.J.Crowder 谢谢。这为我阐明了一些不同的概念。
-
@Charles:乐于助人。您可能会发现我的博客文章很有用:Closures are not complicated.
-
@T.J.Crowder 奇怪的是,当我过去搜索闭包或范围时,这篇文章并没有出现在谷歌搜索中。但这是我需要的确切文章。谢谢。
标签: javascript variables scope closures