繁体   English   中英

浏览器和节点之间有什么区别?

[英]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中,这是不同的。 顶级范围不是全球范围; Node模块内的var something将是该模块的本地内容。

在浏览器中, this是对一个参考window对象-浏览器的全局命名空间-对于其上调用独立的对象的所有功能(例如, 喜欢foo.bar() 在Node中, this不是对全局命名空间的引用。


节点解释器中的NB console.log(this.name)将打印Lulu ,而不是undefined 那是因为, 仅在REPL中,

> this === global
true

进一步阅读@ 如何节点:什么是“这个?”


好了,按照提示通过一个多编辑@ SIME维达斯关于评论thisES5严格模式

  • 在全局上下文中(在任何函数之外), this指的是全局对象,无论是否处于严格模式。
  • this关键字出现在函数内部时,其值取决于函数的调用方式
  • 当一个函数被调用作为对象的方法,其this被设置为方法被调用的对象。

更有趣的阅读由Juriy Zaytsev(又名@kangax)他的一篇博客文章中提供

您的浏览器代码具有window主机对象。 节点没有该主机对象。 设置this.name ,实际上是将其设置为window对象,即创建全局变量。

window.name === this.name // true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM