来自MDN和不起作用的书籍的JavaScript`this`示例。。。为什么?

来自MDN和不起作用的书籍的JavaScript`this`示例。。。为什么?,javascript,node.js,this,Javascript,Node.js,This,我试图理解JS这个,因为它让我太困惑太久了,到目前为止还没有人给我一个我能理解的解释。我去了MDN并尝试了他们文档中的一个简单代码示例。直接从他们的页面复制的代码如下(控制台日志是我唯一添加的): 根据MDN,输出应为: Global Custom Custom 相反,我得到了 undefined Custom Custom 令人难以置信的是,我尝试了一个比较有名的系列文章,第2册第2章中关于这个的例子。我尝试了以下示例,逐字逐句: function foo() { console.

我试图理解JS
这个
,因为它让我太困惑太久了,到目前为止还没有人给我一个我能理解的解释。我去了MDN并尝试了他们文档中的一个简单代码示例。直接从他们的页面复制的代码如下(控制台日志是我唯一添加的):

根据MDN,输出应为:

Global
Custom
Custom
相反,我得到了

undefined
Custom
Custom
令人难以置信的是,我尝试了一个比较有名的系列文章,第2册第2章中关于
这个
的例子。我尝试了以下示例,逐字逐句:

function foo() {
    console.log( this.a );
}

var a = 2;

foo();
书上说输出应该是
2
,但我得到了
未定义的


这正是我想了解更多关于
的原因,但即使是书籍和MDN直接代码示例也无法让我理解JS的核心概念。请帮我把这一点弄清楚。

在Node.js模块中用
var
声明的变量不会在全局对象上结束–模块有自己的作用域。可以将要读取的属性显式放置在全局对象上:

global.a = 'Global';
(在浏览器中,它是
窗口
,而不是
全局
,或者您可以使用便携式
全局本
。)

但是,您不必太担心这种行为。在中,您应该始终使用它(它将自动应用于类和ES模块等新功能),像
whatsThis()
这样的普通函数调用的
this
只是
未定义的

“严格使用”;
函数whatsThis(){
console.log('这是'+这);
}
设obj={
这是什么,
};
这是什么;
whatsThis.call('a string');

这是什么
在Node.js模块中用
var
声明的变量不会在全局对象上结束–模块有自己的作用域。可以将要读取的属性显式放置在全局对象上:

global.a = 'Global';
(在浏览器中,它是
窗口
,而不是
全局
,或者您可以使用便携式
全局本
。)

但是,您不必太担心这种行为。在中,您应该始终使用它(它将自动应用于类和ES模块等新功能),像
whatsThis()
这样的普通函数调用的
this
只是
未定义的

“严格使用”;
函数whatsThis(){
console.log('这是'+这);
}
设obj={
这是什么,
};
这是什么;
whatsThis.call('a string');

这是什么您在哪里运行此代码?将您发布的代码复制/粘贴到浏览器的控制台中,可以得到全局、自定义、自定义和2。MDN示例没有问题,我在命令行中使用Node.js运行这些简单的示例。我想我需要问的问题是,为什么
这个
在Node中的工作方式与在浏览器中的不同?你在哪里运行这个代码?复制/粘贴你发布到浏览器控制台的代码会给我全局、自定义、自定义、2。MDN示例没有问题,我在命令行中使用Node.js运行这些简单的示例。我想我需要问的问题是,为什么
this
在节点中的工作方式与在浏览器中的工作方式不同?如果
this
在全局范围内没有意义,而普通函数调用的
this
在严格模式(我们应该使用)下的设计是
未定义的
,我是否明白,我们应该避免使用
?如果我们必须用
call
/
bind
/
apply
来设计它,那么它有什么用处呢?不幸的是,我越来越困惑,而不是越来越少。@Steverino:
这是针对方法和构造函数的。在现代JS中,您将经常在类中使用它,偶尔会在非类方法调用中使用,很少在其他一些特殊情况下使用。但是,绝对不是在顶级或全局函数调用中(尽管在某个时候了解这些函数的作用仍然很好,这样您就可以使用它来阅读代码)。如果
这个
在全局范围内没有意义,而普通函数调用的
这个
在严格模式下的设计中是
未定义的
(我们应该使用它),我是否明白,我们应该避免使用
?如果我们必须用
call
/
bind
/
apply
来设计它,那么它有什么用处呢?不幸的是,我越来越困惑,而不是越来越少。@Steverino:
这是针对方法和构造函数的。在现代JS中,您将经常在类中使用它,偶尔会在非类方法调用中使用,很少在其他一些特殊情况下使用。不过,肯定不是在顶级或全局函数调用中(尽管在某个时候了解这些函数的作用仍然很好,这样您就可以使用它阅读代码)。
global.a = 2;