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
,isNaN
和Date
简单地使用他们的名字.除了ECMAScript规范要求的属性之外,您的JavaScript主机环境还会将其他属性放在全局对象中,例如alert
或console
.在浏览器中,我可以编写脚本
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)
果然,每次都有"东西".
"true"全局变量没有"var"关键字.试试这个:
test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);
Run Code Online (Sandbox Code Playgroud)
有了这个,所有范围都会看到它.var关键字的变量是声明它们的范围的本地变量.
一个变量将是"全局到窗口"(窗口对象的属性),只有当你在窗口范围内声明它时,如丹所说,使它通常使用窗口作为全局范围的浏览器是全局的.
归档时间: |
|
查看次数: |
8482 次 |
最近记录: |