JS全局变量到局部变量

时间:2012-06-04 19:42:15

标签: javascript variables global local

这是一个简单的问题。

我知道全局变量是在函数外声明时创建的(w3schools.com说)。

我的问题是,如果我创建一个全局变量并在函数中编辑它,它是否变为本地变量?函数给出的新值是否成为全局值?

4 个答案:

答案 0 :(得分:7)

通常,不,编辑全局不会使其成为本地:

var myglob = 5;
function incGlob() {
    myglob = myglob + 1;
}

incGlob();
console.log(myglob); // is 6 now

但是,如果将全局变量作为参数传递,则参数是本地副本:

var myglob = 5;
function incArg(myloc) {
    myloc = myloc + 1;
}

incArg(myglob);
console.log(myglob); // is still 5

请注意,对象是通过引用传递的,因此编辑参数变量的成员变量会更改传入的原始对象的成员变量:

var myglob = { foo:5 };
function editLoc(myloc) {
    myloc.foo = 6;
}

editLoc(myglob);
console.log(myglob.foo); // foo is 6 now

最后,请注意上面editLoc中的局部变量只是一个参考。如果我们尝试覆盖整个对象(而不是成员变量),该函数将丢失对原始对象的引用:

var myglob = { foo:5 };
function clobberLoc(myloc) {
    myloc = { bar:7 };
}

clobberLoc(myglob);
console.log(myglob.foo); // myglob is unchanged...
// ...because clobberLoc didn't alter the object,
// it just overwrote its reference to the object stored in myglob 

答案 1 :(得分:5)

不,编辑全局变量不会改变变量的范围。分配的新值将成为全局值。

http://jsfiddle.net/RtnaB/

myGlobal = 'foo'; // notice no 'var' keyword, implicitly global (DON'T DO THIS)

console.log(myGlobal); // logs 'foo'

var myFunc = function () {
    myGlobal = 'bar';
};

myFunc();

console.log(myGlobal); // logs 'bar'

答案 2 :(得分:3)

如果您在函数内使用var关键字声明,则只会创建一个局部变量。

答案 3 :(得分:2)

新值成为全球价值。