2014-01-18 85 views
2

可以說我有一個封閉幾個變量,像這樣:分配給document.getElementById可在閉包之外訪問的變量?

(function() { 
    var foo = document.getElementById('foo'), 
     bar = 'baz'; 
}()); 

此外,假設我有FOO的ID的HTML元素:

<h1 id = 'foo'>foo</h1> 

我然後嘗試訪問每個封閉外的封閉變量。
第一條:

console.log(bar); //logs a reference error 'bar is not defined' 

然後富:

console.log(foo.innerHTML) // logs 'foo' instead of throwing reference error. Why? 

爲什麼foo是仍然是封閉的外部訪問?

聽到的是的jsfiddle是否有幫助:http://jsfiddle.net/YmDmL/

+1

如果您調用'foo'變量*任何其他*,這將顯示問題不是變量'泄漏',而是來自(早期/非常早的IE)的保留,其中具有'id在全球範圍內可以通過其「id」的名稱立即訪問;這裏是[演示](http://jsfiddle.net/davidThomas/YmDmL/1/),請注意我已經刪除/刪除了'display'賦值。 –

+0

因爲瀏覽器將具有id的元素作爲變量添加到全局對象中。 – elclanrs

+0

@DavidThomas:這似乎是票。我沒有意識到這種行爲。我假設這是另一個在HTML標記中避免無關id屬性的原因。如果你可以在評論中發表你的評論,我會很樂意接受它作爲正確的答案。 – 123

回答

0

的「問題'並不是閉包內定義的foo變量在閉包之外是可用的(就像你自己證明當你得到的參考錯誤時);這是瀏覽器自動創建變量,在全局範圍內,所有具有使用id作爲變量名的id屬性的元素。

在這種情況下:

<div id="foo">text in foo</div> 
<span id="aSpan">other text, in aSpan</span> 

將創建兩個變量,divaSpandemo

正如我建議,在評論你的問題,如果你改變你的JavaScript調用foo什麼否則,你會看到很明顯的,有沒有局部變量的泄漏:

(function() { 
    var whatever = document.getElementById('foo'), 
     bar = 'baz'; 
}()); 

console.log(foo); // outputs: <div id="foo">text in foo</div> 
console.log(whatever); // outputs: Uncaught ReferenceError: whatever is not defined 

JS Fiddle demo

0

您可以添加命名空間,如下所示:

(function() { 
var foo = document.getElementById('foo'), 
    bar = 'baz'; 
}(myNameSpace)); 

,然後從封閉使用外:

console.log(myNameSpace.bar); 
+1

很高興知道,但不完全是我所要求的。 – 123