我知道在定义函数时会创建范围。但是,如果在定义嵌套函数时,或者在执行嵌套函数时,还是捕获了变量值(在函数中定义,在内部函数中引用,也称为闭包),我也不确定是否正确理解。
在循环场景中众所周知的闭包中,闭包似乎在循环结束时捕获“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
答案 0 :(得分:4)
声明变量时会捕获它。 值>未被捕获(这就是它可以更改的原因)。
var fnName = function(x){ // Here
return function(){ return ++x; };
};
var fnName = function(){
var x = 0; // Here (but remember that hoisting exists)
return function(){ return ++x; };
};