【问题标题】:JavaScript scope gets changed? Why does this happen?JavaScript 范围被改变了?为什么会这样?
【发布时间】:2013-05-24 02:06:32
【问题描述】:

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

var a = 6;

function b() {
    a = 10;

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

【问题讨论】:

    标签: javascript scope hoisting


    【解决方案1】:

    由于可变提升,订单解释如下所示。请注意,正如@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 定义为b 中的一个函数,强制a 是b 的本地函数,即使没有明确地执行var a。隐式局部作用域背后的魔力是什么?
    • @sabithpocker 这是嵌套 function 的默认行为,因为它们在 function 的本地,它们在 ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 中定义
    • 为什么“function a() {}”用括号括起来时,提升行为会发生变化? jsfiddle.net/ZrgxX
    • @user2430508 - 因为将其包裹在括号中使其成为表达式并将函数定义范围限定为该表达式。考虑一下:jsfiddle.net/eVgw3,您可以清楚地看到 a 是局部范围的表达式。
    【解决方案2】:

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

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

    【讨论】:

    • 如果你把var a = 10;放在b函数的顶部,你将有一个隐藏全局的局部变量。我还相信function a () 的行为与var a = function () 相同(创建一个名为a 的局部变量,即function)。
    • 同意,这里嵌套的function a 的隐式本地声明是踢球者jsfiddle.net/AVcqr ...
    • 是的,@TravisJ 解释得更好。我从来没有听说过hoisting 这个词,这对我来说是新的。 :)
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-10-05
      • 1970-01-01
      • 2012-08-24
      • 2012-01-24
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多