何时闭包在javascript中捕获变量值(在外部函数中定义):何时定义或执行嵌套函数?

时间:2013-12-22 12:01:24

标签: javascript variables scope closures

我知道在定义函数时会创建范围。但是,如果在定义嵌套函数时,或者在执行嵌套函数时,还是捕获了变量值(在函数中定义,在内部函数中引用,也称为闭包),我也不确定是否正确理解。

在循环场景中众所周知的闭包中,闭包似乎在循环结束时捕获“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

1 个答案:

答案 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; };
};