为什么JavaScript“ this”在节点和浏览器环境中返回不同的值?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么JavaScript“ this”在节点和浏览器环境中返回不同的值?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2178字,纯文字阅读大概需要4分钟。
内容图文
看完Kyle Simpson在Pluralsight上的Advanced JavaScript课程之后,我创建了一个简单的代码片段来尝试这种绑定.我通常在SublimeText编辑器中工作,并在其中配置了节点构建引擎,有时我也在浏览器中运行相同的代码.我注意到在Node和浏览器[Chrome]中执行代码时,程序输出中的一个区别.
以下是尝试进行此绑定的代码段.
function foo() {
console.log(this.bar);
}
var bar = "bar1";
var obj = {bar : "bar2"};
foo();
foo.call(obj);
当我使用Sublime执行它时,它返回undefined和bar2.但是,当我在浏览器中执行相同的代码段时,它将返回bar1和bar2,我认为这是正确的,因为变量bar是在全局范围内定义的.我不明白为什么节点环境会返回未定义的状态.请帮助.
解决方法:
在node.js中,您的bar变量是该模块本地的模块变量.它不是全局变量.必须将节点中的全局变量明确分配给全局对象. node.js模块中的顶级声明并不像浏览器JS文件中那样自动成为全局变量.从技术上讲,它们存在于模块加载器创建的功能范围内,因此它们是模块功能范围的局部变量.
在node.js中,像foo()这样的普通函数调用中的this值是全局对象.
但是,在node.js中,您的bar变量不是全局对象的属性.因此,当您尝试引用this.bar时,即为global.bar,并且该名称在全局对象上没有属性.
因此,在node.js中,您实际上是在这样做:
// create a function which is like the module scope
function myModuleFunc() {
function foo() {
// the value of this in a plain function call in node.js is the
// global object
console.log(global.bar);
}
// this isn't a global
var bar = "bar1";
foo();
}
// execute that module scope function
myModuleFunction();
并且,希望您可以看到为什么没有global.bar属性,从而使您不确定.
由于var bar是全局变量,而全局变量位于window对象上,并且此=== window偶然地起作用,所以这一切在浏览器中都无法正常工作.两种错误使一项权利有时仅适用.
就像我在评论中说的那样,强烈建议您以严格模式运行代码,有时情况不会偶然发生,但其他情况则不会正常-这个问题都是高度一致的,并且如果您写错了错误,您将立即得到错误.某种代码.
尽管您已经说过您已经了解了浏览器环境中正在发生的事情,但是由于您的问题询问了两者为何不同,因此,我将仅出于涵盖所有基础的目的来描述浏览器的情况.
在浏览器中,在普通函数调用中(当不是在严格模式下)此值是window对象.
在浏览器中,bar变量是全局变量,因此自动成为window对象的属性.
因此,在浏览器中,您实际上是在这样做:
function foo() {
console.log(window.bar);
}
window.bar = "bar1";
foo();
并且,因此,您可以看到为什么它愉快地在window对象上创建一个属性,然后引用它.
内容总结
以上是互联网集市为您收集整理的为什么JavaScript“ this”在节点和浏览器环境中返回不同的值?全部内容,希望文章能够帮你解决为什么JavaScript“ this”在节点和浏览器环境中返回不同的值?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。