JavaScript范围发生了变化?为什么会这样?

时间:2013-05-28 23:43:43

标签: javascript scope hoisting

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

var a = 6;

function b() {
    a = 10;

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

This answer对这里发生的事情有一个非常好的解释。

总结是Javascript分两个阶段处理,编译然后执行。函数定义在编译步骤期间发生,因此在b内部,编译器会看到定义function a() {},并且在a的范围内创建局部变量b。稍后执行代码时,b的范围在执行任何代码之前已经包含局部变量a,因此行a = 10;只是给局部变量一个新值。函数定义已在编译期间处理,因此在执行期间不会发生,因此console.log(a)将输出10