5

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

var a = 6;

function b() {
    a = 10;

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

3 回答 3

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
于 2013-05-28T23:52:48.163 回答
2

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

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

于 2013-05-28T23:47:57.997 回答
2

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

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

于 2013-05-29T00:01:44.690 回答