JavaScript作用域改变了吗?为什么会这样呢?



当调用构造函数a时,'a'的值似乎失去了全局作用域。

var a = 6;
function b() {
    a = 10;
    function a() {}
    console.log(a); //10
}
b();
console.log(a); //6

由于变量提升,订单解释如下所示。请注意,正如@ShadowCreeper正确指出的那样,function a(){}实际上是在函数b内部创建了一个局部变量a,该变量如下所示被提升。

var a;
var b;
a = 6;
b = function() {
 var a;
 a = function(){};
 a = 10;
 console.log(a); //10
}
b();
console.log(a); //6

因为您正在创建一个局部变量(函数a),然后用10替换该局部变量的值(function)。

避免这种情况的一种方法是在所有局部变量和函数前加上"_"(下划线)。

这个答案很好地解释了这里发生的事情。

总结是Javascript分为两个阶段,编译和执行。函数定义发生在编译步骤中,因此在b中,编译器看到定义function a() {},而局部变量a是在b的范围内创建的。随后在执行代码时,b的作用域在执行任何代码之前已经包含了局部变量a,因此a = 10;行只是给局部变量一个新值。函数定义在编译过程中已经被处理,所以在执行过程中不会发生,所以console.log(a)将输出10

最新更新