闭包中的可变范围

时间:2014-01-01 04:15:25

标签: javascript

在以下代码中(来自Secrets of the JavaScript Ninja),我不明白为什么inner | tooLate打印出ronin。我希望undefined

var outerValue = "ninja";
var later;

function outerFunction() {
    var innerValue = "samurai";

    function innerFunction(paramValue) {
        console.log("outerValue:",outerValue);
        console.log("innerValue:",innerValue);
        console.log("paramValue:",paramValue);
        console.log("inner | tooLate", tooLate);
    }
    later = innerFunction;
}

console.log("outer | tooLate", tooLate);

var tooLate = "ronin";

outerFunction();
later("warrior");

我的疑惑是在tooLate内可以访问innerFunction的方式。 innerFunction的范围是否仅限于outerFunction

http://jsfiddle.net/6HuaS/

1 个答案:

答案 0 :(得分:3)

innerFunction位于outerFunction下,位于window下,因此innerFunction可以访问window的所有属性和方法。

在您的示例中,tooLatewindow范围(全局)下声明。由于您尚未在tooLateouterFunction中声明新的innerFunction,因此它会追溯到window以找到声明的tooLate。< / p>

var b, val = 0;
function a(){
    b = function (){
        console.log(val);
    }
}
a();
val = 2;
b();  //2
Scope:

window
├─ a: function
│ └─ b: function      b can access variables in a, b, and all the way to window
└─ val: number         if the variable name hasn't been overridden