绑定函数的奇怪行为
有人可以解释这里发生了什么?
var dog = { name: "Dogo" } var echo = function() { console.log(this); } dog.echo = echo.bind(this); echo(); dog.echo();
第一个echo()
按预期输出全局对象。 然而,第二个打印空对象不是第一个echo()
打印的内容。 为什么?
编辑:对不起! 我没有提到代码是由nodejs解释器运行的!
谢谢你的帮助。
在nodejs模块的主要范围内, this
variables是指module.exports
,默认情况下它等于空对象{}
,你可以通过运行这些树行来certificate
console.log(this === module.exports); module.exports.a = "a"; console.log(this);
和输出应该是
true { a: 'a' }
这就是为什么你在第二个电话中得到空物体
但是在你的模块中的一个函数里, this
variables引用了nodejs的global
variables ,来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代码。