分配给document.getElementById的变量是否可以在闭包之外访问?

时间:2014-01-18 00:24:15

标签: javascript

假设我在闭包中有一些变量,如下所示:

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

还假设我有一个id为foo的html元素:

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

然后我尝试从闭包外部访问闭包中的每个变量 第一栏:

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

然后foo:

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

为什么foo仍然可以在闭包之外访问?

如果有帮助,

听到jsFiddle:http://jsfiddle.net/YmDmL/

2 个答案:

答案 0 :(得分:0)

您可以添加名称空间,如下所示:

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

然后从封闭之外使用:

console.log(myNameSpace.bar);

答案 1 :(得分:0)

'问题'不是闭包内定义的foo变量在闭包之外是可用的(正如你自己证明当你得到bar的引用错误时);这是浏览器在全局范围内为使用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