绑定函数的奇怪行为

有人可以解释这里发生了什么?

var dog = { name: "Dogo" } var echo = function() { console.log(this); } dog.echo = echo.bind(this); echo(); dog.echo(); 

第一个echo()按预期输出全局对象。 然而,第二个打印空对象不是第一个echo()打印的内容。 为什么?

编辑:对不起! 我没有提到代码是由nodejs解释器运行的!

谢谢你的帮助。

在nodejs模块的主要范围内, thisvariables是指module.exports ,默认情况下它等于空对象{} ,你可以通过运行这些树行来certificate

 console.log(this === module.exports); module.exports.a = "a"; console.log(this); 

和输出应该是

 true { a: 'a' } 

这就是为什么你在第二个电话中得到空物体


但是在你的模块中的一个函数里, thisvariables引用了nodejs的globalvariables ,来certificate它创build了一个如下的模块并运行它

 global.bar = "baz"; function foo() { console.log(this === global); console.log(global.bar); } foo(); 

和输出应该是

 true baz 

这就是为什么你在第一个电话中得到正确的对象

javascript中的绑定函数是改变“this”指向的上下文。

如果你想在echo函数中使用“this”来创build你创build的对象,你应该把dog作为参数绑定。

dog.echo = echo.bind(dog);

在上面的代码行中,改变回显函数中的“this”。 所以现在它会指向狗。

这是您的代码的初始结果: 在这里输入图像描述

在这两种情况下,“回声”都指向全局对象。

一旦你提供狗作为一个参数绑定,现在在这里结果。 正如你可以看到第二个console.log中更改了“this”。 它指向了狗的对象。 在这里输入图像描述

JavaScript应该以某种方式在浏览器和服务器端(大部分时间)performance出来。 节点构build在JavaScript之上。 它使用相同的V8引擎来编译JavaScript代码。