Javascript全局变量存储在哪个对象中?

twi*_*wiz 16 javascript global-variables object

全局变量是否存储在特定对象中?例如:

var test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
Run Code Online (Sandbox Code Playgroud)

所有这三个测试都会产生undefined,那么是否有一个包含这些变量的对象?

我觉得这应该是我应该已经知道的愚蠢,但我似乎无法在网上找到答案.

Ray*_*oal 19

这是一个迟到但技术性的答案.

你问

全局变量是否存储在特定对象中?

答案是肯定的; 它们存储在称为正式的全局对象中.该对象在官方ECMAScript 5规范的第15.1节中描述.

全局对象不需要具有名称; 但你可以参考它的属性,如String,isNaNDate简单地使用他们的名字.除了ECMAScript规范要求的属性之外,您的JavaScript主机环境还会将其他属性放在全局对象中,例如alertconsole.在浏览器中,我可以编写脚本

alert("Hello world");
Run Code Online (Sandbox Code Playgroud)

因为alert是全局对象的属性.

请注意,完全没有办法访问这个全局对象,不管你信不信.然而,很酷的是,许多主机环境会在全局对象中放置一个属性,该属性的值是对全局对象本身的引用.在大多数Web浏览器中,都会调用此属性window.所以我们可以写:

alert("Hello");
window.alert("Hello");
window.window.alert("Hello");
window.window.window.window.window.alert("Hello");
Run Code Online (Sandbox Code Playgroud)

你也可以说:

var x = 5;
alert(this.x);
Run Code Online (Sandbox Code Playgroud)

并得到5警报.


Dan*_*Tao 17

我想你会发现大多数浏览器,它们存放在window.

不可思议的通灵调试尝试:你是否在jsFiddle中测试了这个?或者也许在Firebug中?如果是这样,你可能会看到undefined所有三个,因为在这种情况下代码是在一个框架中执行的; 所以它有一个不同的window对象(我认为)代码实际上是包装的:

window.addEvent('load', function() {
  var test="stuff";
  console.log(window.test);
  console.log(document.test);
  console.log(this.test);
});
Run Code Online (Sandbox Code Playgroud)

您可以从jsFiddle的上述片段中看到,test不是一个全局变量,这解释了为什么它没有被附加到window.

我不是专家,但从Chrome,Firefox,Safari和Opera中可以看出,这个答案似乎是准确的.为了验证,我创建了一个包含以下内容的HTML文件,并将其加载到每个浏览器中:

<script type="text/javascript">
  var test = "stuff";
  alert(window.test);
</script>
Run Code Online (Sandbox Code Playgroud)

果然,每次都有"东西".

  • 这不是一个愚蠢的问题,而是一个很好的问题. (4认同)

dav*_*tto 5

"true"全局变量没有"var"关键字.试试这个:

test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
Run Code Online (Sandbox Code Playgroud)

有了这个,所有范围都会看到它.var关键字的变量是声明它们的范围的本地变量.

一个变量将是"全局到窗口"(窗口对象的属性),只有当你在窗口范围内声明它时,如丹所说,使它通常使用窗口作为全局范围的浏览器是全局的.