2012-06-04 375 views
2

这是一个简单的问题。JS全局变量到局部变量

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

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

+5

http://w3fools.com – SLaks

+0

你为什么不考呢?保持简单愚蠢:) – Jashwant

回答

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 
3

是的。

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

+0

没有。我刚刚做完。 'var'什么都不做。函数内部声明的变量仍将指向全局变量。 – Bear

+0

@熊:没有; 'var'确实创建了一个本地范围。给我演示一下。 – SLaks

2

新值成为全球价值。

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' 
+1

我更喜欢'window.myGlobal ='foo''而不是'var myGlobal',因为'var'的使用在函数之外引起误解......(它不是*词汇变量,而是一个属性,并且不使用相同的关闭规则) – 2012-06-04 19:48:14

+1

@pst为你编辑:) – jbabey