2012-06-04 271 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