第二个console.log上发生了什么?bar
?不应该是“安迪”或抛出参考错误?另外,为什么foo
未定义?
使用Chrome。
// lexical scope example
var bar = "Andy";
try {
console.log(bar); // Andy
(function() {
console.log(bar); // undefined!
var bar = "B",
foo = "Last Name";
console.log(bar); // B
console.log(foo); // Last Name
})();
console.log(bar); // B
console.log(foo); // Reference Error
} catch (e) {
console.log(e);
}
上面的JSFiddle: http://jsfiddle.net/2D9fj/3/
答案 0 :(得分:1)
在解析你的代码之后,var声明被提升了(这就是许多开发人员在顶部定义他们的变量的原因)
// lexical scope example
var bar = "Andy";
try {
console.log(bar); // Andy
(function() {
var bar, foo;
console.log(bar); // undefined!
bar = "B";
foo = "Last Name";
console.log(bar); // B
console.log(foo); // Last Name
})();
console.log(bar); // B
console.log(foo); // Reference Error
} catch (e) {
console.log(e);
}
答案 1 :(得分:0)
以(function() {
开头的行创建一个范围/闭包,它包含bar,foo vars,其值在范围/闭包之外无效
答案 2 :(得分:0)
安德鲁的答案是正确的,但我认为提供一个只是说明提升概念的例子是有用的,没有额外的代码。
// this:
function foo() {
console.log(x);
var x = 1;
}
//is actually interpreted like this:
function foo() {
var x;
console.log(x);// undefined
x = 1;
}
此外,关闭与此问题有关,但只是因为它更难以识别提升错误。
(function parent() {
// x declared and assigned in parent scope
var x = 2;
function foo() {
console.log(x); // 2 (closed around parent scope)
}
function bar() {
console.log(x); // undefined (bar scope, x declaration is hoisted, but not defined yet)
var x = 1;
}
function baz() {
var x = 3;
console.log(x); // 3 (baz scope, defined)
}
//run
foo();
bar();
baz();
}());