繁体   English   中英

JavaScript全局变量作用域问题

[英]Javascript global variable scope issue

我遇到了Java的一个奇怪的范围问题(请参阅JSFiddle ):

var someGlobal = 3;

function someF() {
    // undefined issue
    alert(someGlobal);
    var someGlobal = 5;
    // Displays 5
    alert(someGlobal);
}

function someF2() {
    // Displays 3, why?
    alert(someGlobal);
}

someF();
someF2();

为什么Javascript不会在someF2()引发未定义的问题? 为什么someF2()可以访问someGlobal ,而someF()无法访问? 如何确保可以在函数中访问全局变量?

备注:

在这两种情况下,这些函数都以调用alert(someglobal) ,为什么一个函数抛出未定义的问题,而另一个却没有抛出?

someF创建一个名为someGlobal的新(局部作用域)变量(该变量屏蔽全局someGlobal )并为其分配值。 它不会触及全局someGlobal (尽管无法访问它,因为在作用域中存在另一个具有相同名称的变量)。

var语句悬挂,所以someGlobal被屏蔽所有someF (不仅仅是后var语句)。 直到分配值之前,本地someGlobal的值才是undefined

someF2访问原始的( someGlobal )全局someGlobal

由于您要声明具有相同名称的局部变量。 因此,它将值分配给局部变量。 只需从someF()中的var someGlobal中删除var,就可以了。

var someGlobal = 3;

function someF() {
    // undefined issue
    alert(someGlobal);
    someGlobal = 5; // <-- orignially var someGlobal = 5
    // Displays 5
    alert(someGlobal);
}

function someF2() {
    // Should display 5 now
    alert(someGlobal);
}

someF();
someF2();

someF2显示3,因为它仍然 3。

在someF()中,创建一个新变量,该变量恰好具有与someGlobal相同的名称。 这对原始的someGlobal并没有任何作用,它只是在本地创建一个新变量来使someF函数在该函数结束时消失。

因此,您具有局部变量(例如,在someF中使用var创建)和全局变量。

这是一个使用this的示例,该示例如何在someF内同时使用局部变量和全局变量。

var someGlobal = 3;

function someF() {

    // Displays 3
    alert(someGlobal);
    this.someGlobal = 5;
    someGlobal = 5;
    // Displays 5
    alert(this.someGlobal);
}

function someF2() {
    // Displays 5
    alert(someGlobal);
}

someF();
someF2();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM