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

时间:2012-07-20 04:36:48

标签: javascript object global-variables

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

var test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);

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

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

4 个答案:

答案 0 :(得分:19)

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

你问

  

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

答案是肯定的;它们存储在正式名称​​全局对象中。 official ECMAScript 5 Specification的第15.1节描述了此对象。

全局对象不需要具有名称;但您只需使用其名称即可引用其属性,例如StringisNaNDate。除了ECMAScript规范所要求的属性之外,您的JavaScript主机环境还会将其他属性放在全局对象中,例如alertconsole。在浏览器中,我可以编写脚本

alert("Hello world");

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

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

alert("Hello");
window.alert("Hello");
window.window.alert("Hello");
window.window.window.window.window.alert("Hello");

你也可以说:

var x = 5;
alert(this.x);

并提醒5

答案 1 :(得分: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);
});

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

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

<script type="text/javascript">
  var test = "stuff";
  alert(window.test);
</script>

果然,每次都有“东西”。

答案 2 :(得分:5)

“true”全局变量没有“var”关键字。 试试这个:

test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);

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

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

答案 3 :(得分:2)

全局变量存储在全局window变量中。如果您只是在任何东西(如函数)之外声明它,则以下代码有效:

var test="stuff";
console.log(window.test);

类似的证明是window.location.hreflocation.href

相同

然而,问题可能在于声明变量的位置。例如,如果在函数中声明了此变量,它将仅存在于函数中,而不是全局:

function foo(){

    //declaring inside function
    var test="stuff";

    //undefined, since the variable exists in the function only
    console.log(window.test);  

    //undefined, document refers to the document
    //which is the top DOM object, not the global window
    console.log(document.test); 

    //depends on what "this" refers to, especially 
    //when using call() or apply() to call the function
    //For normal function calls, usually it points to window as well
    console.log(this.test);  

    //none of the above refer to "test" that contains "stuff"
    //because you are looking in the wrong place   

}