在以下代码中(来自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
?
答案 0 :(得分:3)
innerFunction
位于outerFunction
下,位于window
下,因此innerFunction
可以访问window
的所有属性和方法。
在您的示例中,tooLate
在window
范围(全局)下声明。由于您尚未在tooLate
或outerFunction
中声明新的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