可以说我在闭包中有一些变量,如下所示:

(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/

最佳答案

问题不在于闭包内部定义的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

关于javascript - 分配给document.getElementById的变量可以在闭包之外访问吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21198431/

10-09 16:52
查看更多