我正在阅读书籍#34; Java Script Ninja"关于封闭和范围的章节。
有代码示例:
var innerHolder;
function outerFunction() {
console.log("outerFunction: "+x);
function innerFunction() {
console.log("innerFunction: "+x);
}
innerHolder = innerFunction;
}
console.log("outerScope "+x);
var x = 15
outerFunction();
innerHolder();
结果是:
outerScope undefined
outerFunction:15
innerFunction:15
然后这本书说:
外部作用域中的所有变量,甚至是在之后声明的变量 功能声明,包括在内。
- 醇>
在同一范围内,尚未定义的变量不能 前向引用。
我理解第二点,但第一点对我来说并不完全清楚。看起来这是真的,但只有在进行函数调用之前实际声明了变量。在我的逻辑中,因为如果在调用内部函数之后声明变量,变量不会被提升,那么它在当时不在外部范围内,因此它不会被闭包选中。这是对的吗?
即。如果我修改代码:
console.log("outerScope "+x);
outerFunction();
innerHolder();
var x = 15
结果将是:
outerScope undefined
outerFunction:undefined
innerFunction:undefined
答案 0 :(得分:1)
首先,所有函数声明都将由Javascript处理。然后一切都将从左到右处理。
function sayHi(){console.log(x)}; sayHi(); var x = 1; // undefined
function sayHi(){z()}; sayHi(); function z() {console.log(2)}; var x = 1; // 2
所以你是对的。他希望向您展示的是lexical scope查看所包含链接的本质,您将比从该书中包含的示例更好地理解它。
这是在您的示例中执行所有内容的顺序:
var innerHolder;// 2 (innerHolder = undefined)
function outerFunction() { // 1
console.log("outerFunction: "+x) // 6;
function innerFunction() { // 7
console.log("innerFunction: "+x) // 10;
}
innerHolder = innerFunction; // 8
}
console.log("outerScope "+x); // 3
var x = 15 // 4
outerFunction(); //5
innerHolder(); // 9