【问题标题】:global and local variable execution context in javascriptjavascript中的全局和局部变量执行上下文
【发布时间】:2023-12-07 07:43:01
【问题描述】:

为了理解 javascript 的基础知识,我遇到了以下代码,名为“foo”的变量的预期值是 7 和 5,但结果却是 7 和 7。不知道为什么....

var foo = 5;
(function Test() {
    foo = 7;
    console.log("foo=" + foo);
})();
console.log("foo=" + foo);

foo=7
foo=7

【问题讨论】:

  • 一个非常好的关于 Scope 的幻灯片和这个......你没有使用这个但仍然很好地超出了范围 davidql.github.io/scope_talk/#
  • @Someone 你是在暗示this 不会回答他们的问题?认真的吗?
  • 您为什么希望它不会改变?你没有局部变量。
  • 这是因为他在调用函数之前声明了 foo 所以它正在修改同一个变量。 Foo 不是该匿名函数的本地范围。

标签: javascript variables global local


【解决方案1】:

因为当您执行foo = 7; 时,它会生成一个全局变量 并将其设置为7,即使在函数完成后它仍然是7。你可能希望它是一个局部变量:

(function Test() {
    var foo = 7;
    console.log("foo=" + foo);
})();

【讨论】:

  • 谢谢。当我阅读您的回复时,我立即明白了我的误解。
【解决方案2】:

要得到 7 和 5,你需要在 "foo = 7;" 之前加上 "var"在你的函数中,以防止它覆盖你在函数外声明的全局 foo。

也就是说,在函数内声明变量时,需要使用 var 使其局部作用于函数。

【讨论】:

    【解决方案3】:

    您正在声明一个全局变量,然后在您的函数中引用它。如果您想要一个局部变量,请在您的函数中使用 var 关键字声明它。

    //foo variable definition here
    var foo = 5;
    
    (function Test() {
        //Referencing the already globally defined var.
        //Use var foo = 7 in order to define a new local var.
        foo = 7;
        console.log("foo=" + foo);
    })();
    console.log("foo=" + foo);
    

    【讨论】:

      【解决方案4】:

      在立即调用的匿名方法中引用全局变量并不意味着它会覆盖全局范围内的变量!

      仅当当前范围内没有其他 foo 可访问时,foo=7 之类的东西才会创建一个新变量。在这种情况下存在!

      立即调用匿名函数并不是一个完全孤立的作用域。作为一个函数,它有一个局部范围,在块之外是不可用的。但它仍然可以访问全局范围。

      【讨论】: