为什么JavaScript声明变量在初始化之前在全局对象中?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么JavaScript声明变量在初始化之前在全局对象中?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1324字,纯文字阅读大概需要2分钟。
内容图文
我偶然发现了一个我无法解释的JavaScript变量行为.
The scope of a variable declared with var is the enclosing function
or, for variables declared outside a function, the global scope (which
is bound to the global object).
此外,众所周知,全局变量成为全局对象的属性 – 浏览器环境中的“窗口”和node.js中的“全局”
这意味着如果在函数内使用’var’关键字声明变量,它将变为本地变量并且不会进入全局对象.
这个例子证明了这一点:
(function(){
var t = 1;
console.log(t in window, t); // outputs: false 1
}());
到现在为止还挺好.但是,如果变量未初始化,则它确实成为窗口对象的属性,尽管它在函数范围内.
(function(){
var t;
console.log(t in window, t); // outputs: true undefined
}());
为什么会这样?我在哪里可以了解这种行为的细节?常规教程似乎没有涵盖这一点.
提前致谢.
[编辑]:
感谢Pointy很明显,现在范围按预期工作.我对’in’运算符行为的理解错误.根据‘in’ docs,它将左手操作数强制转换为数字或字符串,并在右手对象中查找此类索引或属性名称.
所以在示例中它等于
'1' in window
这是假的
在示例二中它是
'undefined' in window
这是真的.
解决方法:
问题是您的测试代码错误地使用了in运算符.它实际测试的是名称“undefined”是否在窗口中定义,而不是“t”.为什么?因为in的左侧操作数被强制转换为字符串.因为“t”未定义,所以它被强制转换为字符串“undefined”,实际上该属性名称存在于全局上下文中.
将测试更改为
console.log("t" in window, t);
内容总结
以上是互联网集市为您收集整理的为什么JavaScript声明变量在初始化之前在全局对象中?全部内容,希望文章能够帮你解决为什么JavaScript声明变量在初始化之前在全局对象中?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。