Javascript 更改节点JS中函数的上下文
我正在学习如何从更改Javascript中函数的上下文。这里给出的例子完全可以理解:Javascript 更改节点JS中函数的上下文,javascript,node.js,scope,Javascript,Node.js,Scope,我正在学习如何从更改Javascript中函数的上下文。这里给出的例子完全可以理解: var object = {}; function fn(){ return this; } console.log( fn() == this) //true console.log( fn.call(object) == object); //true 但是,当我在NodeJS中尝试这一点时,结果有些不同。第一个语句导致false,第二个等式按预期工作。那么,NodeJS和browser的全局
var object = {};
function fn(){
return this;
}
console.log( fn() == this) //true
console.log( fn.call(object) == object); //true
但是,当我在NodeJS中尝试这一点时,结果有些不同。第一个语句导致false
,第二个等式按预期工作。那么,NodeJS和browser的全局范围有什么不同吗
我知道浏览器的全局作用域名为window
,但节点JS呢?导致上述不同行为的范围之间有什么区别
那么,NodeJS和browser的全局范围有什么不同吗
不同之处在于,脚本不是在节点的全局范围内求值,而是在模块范围内求值,其中直接求值时,此
不是全局变量
在浏览器中,它是此===窗口
。在Node.js中,它是this===module.exports
如果
fn
是一个箭头,那么它将是Node.js中的this===module.exports
。但由于它是正则函数,所以当调用它时,会在全局范围内对其进行求值,比如fn()
fn()==对于节点8.9.3中的我来说,这是一个true
求值过程(注意,最好是严格相等,而不是草率相等)@CertainPerformance查看以下内容:。这与我的本地节点JS给出的结果相同。但在浏览器中,这两条语句的计算结果都是true
。我的节点版本在8.11.2Ah中,我是直接在REPL中输入的,而不是运行.js
,这一定是造成差异的原因。您应该始终使用严格模式,并期望fn()==未定义的
。那么从函数fn
返回的这个
也应该是模块。导出
,所以第一条语句应该计算为true
,这是计算直接引用的。由于fn
不是箭头,因此它不会从封闭上下文(模块范围)中获取此
,而是在全局范围内进行评估。它与eval('this')==module.exports
和(0,eval)('this')==global
。噢!当我将其更改为箭头函数时,第一个返回true
,第二个返回false
!关于JS中的arrow函数和常规函数,我不知道的太多了。arrow函数总是得到词法this
,它们忽略了通过调用
,应用
或绑定
传递给它们的上下文。考虑一下检查太好了!今天我学到了很多东西。谢谢