浏览器和节点有什么区别
what's the difference between Browsers and Node?
浏览器和节点有什么区别?例如:
节点上的setName.js
:
var setName;
setName = function (name) {
return this.name = name;
};
setName("LuLu");
//LuLu
console.log(name);
//undefined
console.log(this.name);
在浏览器中setName.html
:
<script>
var setName;
setName = function (name) {
return this.name = name;
};
setName("LuLu");
//LuLu
console.log(name);
//LuLu
console.log(this.name);
</script>
第二个日志不同,为什么?
Node 是一个 JavaScript 引擎,而不是浏览器。您在 Node 中看到undefined
,而在浏览器中看到Lulu
的具体原因是什么?全局命名空间的差异:
在浏览器中,顶级作用域是全局作用域。这意味着在浏览器中,如果您在全局范围内,
var something
将定义一个全局变量。在 Node 中,这是不同的。顶级作用域不是全局作用域; 节点模块内部var something
将是该模块的本地。
在浏览器中,this
是对window
对象(浏览器的全局命名空间(的引用,用于所有未附加到对象的函数(例如,不像foo.bar()
(。在 Node 中,this
根本不是对全局命名空间的引用。
注
:注: 节点解释器中的console.log(this.name)
将打印Lulu
,而不是undefined
。这是因为,仅在 REPL 中,
> this === global
true
延伸阅读@如何节点:"这个"是什么?
好的,根据 @Šime Vidas 关于 ES5 严格模式下this
的评论提示,再进行一次编辑:
- 在全局上下文中(在任何函数之外(,
this
引用全局对象,无论是否处于严格模式。- 当
this
关键字出现在函数内部时,其值取决于函数的调用方式。- 当函数作为对象的方法调用时,其
this
设置为调用该方法的对象。
更有趣的阅读由Juriy Zaytsev(又名@kangax(在他的一篇博客文章中提供。
您的浏览器代码具有 window
主机对象。节点没有该主机对象。当你设置this.name
时,你实际上是在将其设置为window
对象,也就是创建一个全局变量。
window.name === this.name // true
相关文章:
- 全局变量和全局对象的属性之间有什么区别吗
- 在ember/handlers中使用value和valueBinding有什么区别
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- Math.min()和Math.max()之间有什么区别?在Javascript中
- angularjs中的ng网格和ui网格有什么区别
- webpack开发模式和生产构建模式之间有什么区别
- 缓存!saveLocations()和addLocation()函数有什么区别
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 以下两者在javascript中有什么区别
- jquery.js和jquery.lite.js有什么区别
- 通过Nuget安装Angular JS和Angular JS核心有什么区别
- XMLHttpRequest对象的open()和send()方法之间有什么区别
- 这两种不同的创建对象文字的方法有什么区别
- jQuery中这两个词有什么区别
- 在Javascript语法中:和::和:::有什么区别
- getElementById 和 getElementsByClassName 有什么区别?
- (typeof variable === “function”) 和 jQuery.isFunction() 有什么区别
- 在使用JS的Ajax调用中,ajaxComplete和beforesend之间有什么区别
- $(e.target).find和template.find('input').value之间有什么区别
- 在javascript中,在变量名之前使用var有什么区别/优势吗