2011-04-09 44 views
0

我不明白這種行爲:的javascript:創建一個全局變量的局部範圍內取消定義之前,它被設置

var a = 1; 
console.log('a is undefined1:', a == undefined); 
var a; 

//iterate selected jQuery elements: 
jQuery.each(this, function(index, htmlElement) { 
    console.log('a is undefined2:', a == undefined); 
    var a; 

返回
 一個是undefined1:假
 一個是undefined2:真

如果最後一行(風險價值)被註釋掉了,這回
 一個是undefined1:假
 一個是undefined2:假

我總是會想到後者輸出。我不知道什麼?

非常感謝!

回答

6

var a放在一個函數中會創建一個不同的a變量,該變量的作用域爲該函數。

由於您沒有爲其分配值,因此未定義。

當你把它註釋掉,你正在測試外a其中有1

變量懸掛的價值。無論您在哪個函數中使用var foo,該函數的foo仍然適用於整個函數。

+0

啊哈訪問全局變量foo!提升是魔術詞。發現從另一個堆棧溢出。謝謝! http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting – 2011-04-11 05:13:12

1

在函數中使用var聲明變量使本地副本(新變量)具有整個函數的作用域 - 在聲明它之前是否使用它並不重要。

千萬不要聲明沒有var的變量。

如果您要訪問的golobal變量和你同名的局部變量,你可以使用window.foo