在以下代码中(来自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/
最佳答案
innerFunction
在outerFunction
下,而在window
下,因此innerFunction
可以访问window
的所有属性和方法。
在您的示例中,tooLate
在window
范围(全局)下声明。由于您没有在tooLate
或outerFunction
中声明新的innerFunction
,因此它将一直追溯到window
以查找已声明的tooLate
。
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