函数声明如何影响提升?
How function declaration is affecting hoisting?
尽管没有调用内部函数,但下面的两个代码打印了不同的输出。
var a = 1;
function foo(){
a= 2;
}
foo();
console.log(a); // 2
但是如果我添加一个同名的函数,输出就不同了。虽然我不是在调用 a()
var a = 1;
function foo(){
a= 2;
function a(){
a = 3;
}
}
foo();
console.log(a); // 1
不应该是2吗?为什么它记录 1?
因为在 foo
函数内直接声明了一个名为 a
的标识符,所以在 foo
函数内对名为 a
的变量赋值将引用该(本地)标识符,而不是任何可能的名为 a
的外部变量。就像:
var a = 1;
function foo(){
// there an identifier named `a` initialized in this scope
var a;
// function declarations are hoisted
a = function a(){
a = 3;
}
// assignment to local identifier `a`
a= 2;
}
foo();
console.log(a); // 1
尽管没有调用内部函数,但下面的两个代码打印了不同的输出。
var a = 1;
function foo(){
a= 2;
}
foo();
console.log(a); // 2
但是如果我添加一个同名的函数,输出就不同了。虽然我不是在调用 a()
var a = 1;
function foo(){
a= 2;
function a(){
a = 3;
}
}
foo();
console.log(a); // 1
不应该是2吗?为什么它记录 1?
因为在 foo
函数内直接声明了一个名为 a
的标识符,所以在 foo
函数内对名为 a
的变量赋值将引用该(本地)标识符,而不是任何可能的名为 a
的外部变量。就像:
var a = 1;
function foo(){
// there an identifier named `a` initialized in this scope
var a;
// function declarations are hoisted
a = function a(){
a = 3;
}
// assignment to local identifier `a`
a= 2;
}
foo();
console.log(a); // 1