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

Javascript全局变量存储在哪个对象中?,javascript,object,global-variables,Javascript,Object,Global Variables,全局变量是否存储在特定对象中?例如: var test="stuff"; console.log(window.test); console.log(document.test); console.log(this.test); 所有这三个测试都会导致未定义,那么是否有一个对象保存这些变量 我觉得这是一件我应该知道的愚蠢的事情,但我甚至在网上找不到答案。我想你会在大多数浏览器上找到,它们都存储在窗口中 牵强的心理调试尝试:您在JSFIDLE中测试过吗?或者在Firebug中?如果是这样的话,您

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

var test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
所有这三个测试都会导致
未定义
,那么是否有一个对象保存这些变量


我觉得这是一件我应该知道的愚蠢的事情,但我甚至在网上找不到答案。

我想你会在大多数浏览器上找到,它们都存储在
窗口中

牵强的心理调试尝试:您在JSFIDLE中测试过吗?或者在Firebug中?如果是这样的话,您可能会看到这三种代码都是
未定义的
,因为在这种情况下,代码是在一个帧中执行的;因此它有一个不同的
窗口
对象(我认为)代码实际上是包装的:

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>

var test=“stuff”;
警报(窗口测试);
果然,每次都是“stuff”。

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

test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
有了这个,所有的作用域都会看到它。带有var关键字的变量是声明它们的作用域的局部变量


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

全局变量存储在全局
窗口
变量中。如果只在任何对象(如函数)之外声明,则以下代码有效:

类似的证据是
window.location.href
location.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   

}

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

你问

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

答案是肯定的;它们被存储在官方称为全局对象的东西中。本手册第15.1节对该对象进行了描述

全局对象不需要有名称;但您可以通过使用其名称来引用其属性,例如
String
isNaN
、和
Date
。您的JavaScript主机环境将在全局对象中放置ECMAScript规范要求的属性之外的其他属性,例如
警报
控制台
。在浏览器中,我可以编写脚本

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
警报。

简短回答:如何引用全局变量取决于您的环境。您所说的“环境”到底是什么意思?浏览器、scope、OS?JavaScript可以在浏览器、Adobe Photoshop、旧的VRML浏览器、可以嵌入Java程序和许多其他主机系统的引擎中运行。我们称之为“主机环境”。因此,是的,它可能是一个浏览器。JavaScript程序操纵这些环境中的对象。我知道我认为“这是我应该知道的愚蠢的事情”是有原因的。你说得对,我用的是JSFIDLE。。。谢谢你给我指出了我自己愚蠢的方向。哈哈,我和雷在一起;这绝对是个好问题。事实上,我越想这个答案是真的,这就有点奇怪了。+1用于深入研究JSFIDLE内部。回答得好。然而,包装其实并不奇怪;IMHO从JavaScript环境运行JavaScript是一种聪明的方法,而无需(直接?)使用
eval
:)@雷托:哦,我不是说包装很奇怪。我指的是这样一个事实,在JS中,在全局范围内用
var
声明一个变量实际上是将它附加到一个对象(例如,浏览器中的
window
,节点中的
global
),而在局部范围内则不是。啊,是的,这很奇怪!人们会期望顶级变量(用
var
定义)是堆栈框架中的变量,而不是直接作为属性添加到对象中。这是
var
关键字,有很好的眼力。“真正的”全局变量?如果在全局范围中使用
var
,它将生成一个全局变量。@nnnnnn使用双引号是有意的;)有趣。我在JSFIDLE中尝试了这个,结果得到了“stuff”、“undefined”、“stuff”。第一个和最后一个是相同的,因为
this===window
var x = 5;
alert(this.x);