来自MDN和不起作用的书籍的JavaScript`this`示例。。。为什么?
我试图理解JS来自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.
这个
,因为它让我太困惑太久了,到目前为止还没有人给我一个我能理解的解释。我去了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;