当调用构造函数 a 时,'a' 的值似乎失去了全局范围。
var a = 6;
function b() {
a = 10;
function a() {}
console.log(a); //10
}
b();
console.log(a); //6
当调用构造函数 a 时,'a' 的值似乎失去了全局范围。
var a = 6;
function b() {
a = 10;
function a() {}
console.log(a); //10
}
b();
console.log(a); //6
由于可变提升,订单被解释如下所示。请注意,正如@ShadowCreeper 正确指出的那样,function a(){}
实际上是a
在函数 b 内部创建一个局部变量,如下所示。
var a;
var b;
a = 6;
b = function() {
var a;
a = function(){};
a = 10;
console.log(a); //10
}
b();
console.log(a); //6
因为您正在创建一个局部变量(函数a
),然后将该局部变量的值(该function
)替换为10
.
避免这种情况的一种方法是在所有局部变量和函数之前加上“_”(下划线)。
这个答案对这里发生的事情有一个非常好的解释。
总结就是Javascript分两个阶段处理,编译和执行。函数定义发生在编译步骤中,因此在b
编译器内部可以看到定义function a() {}
,并且a
在b
. 稍后执行代码时,在执行任何代码之前,范围b
已经包含局部变量a
,因此该行a = 10;
只是给局部变量一个新值。函数定义在编译期间已经被处理,因此在执行期间不会发生,所以console.log(a)
会输出10
。