全局变量是否存储在特定对象中?例如:
var test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
所有这三个测试的结果都是undefined
,那么是否有一个包含这些变量的对象?
我觉得好像这是我应该已经知道的愚蠢的事情,但我什至似乎无法在网上找到答案。
全局变量是否存储在特定对象中?例如:
var test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
所有这三个测试的结果都是undefined
,那么是否有一个包含这些变量的对象?
我觉得好像这是我应该已经知道的愚蠢的事情,但我什至似乎无法在网上找到答案。
这是一个迟到但技术性的答案。
你问
全局变量是否存储在特定对象中?
答案是肯定的;它们存储在正式称为全局对象的东西中。这个对象在官方 ECMAScript 5 Specification的第 15.1 节中有描述。
全局对象不需要有名称;但是您可以简单地使用它们的名称来引用它的属性,例如String
, isNaN
, 。Date
除了 ECMAScript 规范要求的属性之外,您的 JavaScript 宿主环境还将在全局对象中放置其他属性,例如alert
或console
。在浏览器中,我可以编写脚本
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
警报。
我想你会在大多数浏览器上找到,它们存储在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>
果然,每次都是“东西”。
“真”全局变量没有“var”关键字。尝试这个:
test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
有了这个,所有范围都会看到它。带有 var 关键字的变量在它们声明的范围内是本地的。
只有当您像 Dan 所说的那样在窗口范围内声明变量时,变量才会是“窗口的全局”(窗口对象的属性),这使得它对于通常使用窗口作为全局范围的浏览器来说是全局的。
全局变量存储在全局window
变量中。如果您只是在任何东西(如函数)之外声明它,则以下代码有效:
var test="stuff";
console.log(window.test);
类似的证明是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
}