Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更改节点JS中函数的上下文_Javascript_Node.js_Scope - Fatal编程技术网

Javascript 更改节点JS中函数的上下文

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的全局

我正在学习如何从更改Javascript中函数的上下文。这里给出的例子完全可以理解:

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
,它们忽略了通过
调用
应用
绑定
传递给它们的上下文。考虑一下检查太好了!今天我学到了很多东西。谢谢