绑定函数的奇怪行为

时间:2017-12-03 11:24:33

标签: javascript node.js javascript-objects

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

var dog = {
   name: "Dogo"
}

var echo = function() {
    console.log(this);
}

dog.echo = echo.bind(this);

echo();
dog.echo();

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

nodejs模块this变量中的主要范围指的是module.exports,默认情况下它等于空对象{} ,你可以通过运行这些树线

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

,输出应为

true
{ a: 'a' }

这就是你在第二次调用中获得空对象的原因

在模块中的一个函数内,this变量引用了{j}的global变量,以证明它创建了一个类似下面的模块并运行它

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

,输出应为

true
baz

这就是你在第一次通话中得到正确对象的原因

答案 1 :(得分:0)

javascript中的绑定功能是将上下文更改为" this"指向。

如果你想"这个"在echo函数中你已经创建了dog对象,你应该将dog作为绑定的参数传递。

dog.echo = echo.bind(dog);

上面的代码行,改变"这个"回波函数中的点。所以现在它会指向狗。

以下是您的代码的初始结果: enter image description here

在这两种情况下"这个"在echo中指向全局对象。

现在这里结果一旦你提供狗作为绑定的参数。 你可以看到"这个"更改为第二个console.log。它指向了狗的对象。  enter image description here

Javascript应该在浏览器和服务器端以某种方式运行(大多数情况下)。 Node建立在javascript之上。它使用相同的v8引擎来编译javascript代码。