Javascript 为什么本例中原型函数的执行上下文(“this”)是错误的?
原型函数Javascript 为什么本例中原型函数的执行上下文(“this”)是错误的?,javascript,node.js,this,anonymous-function,Javascript,Node.js,This,Anonymous Function,原型函数bar在Node.js环境中的其他位置执行(应该可以使用)。我希望这个内部bar()函数成为我的对象的实例: var Foo = function (arg) { this.arg = arg; Foo.prototype.bar.bind(this); }; Foo.prototype.bar = function () { console.log(this); // Not my object! console.log(this.arg); //
bar
在Node.js环境中的其他位置执行(应该可以使用)。我希望这个内部bar()
函数成为我的对象的实例
:
var Foo = function (arg) {
this.arg = arg;
Foo.prototype.bar.bind(this);
};
Foo.prototype.bar = function () {
console.log(this); // Not my object!
console.log(this.arg); // ... thus this is undefined
}
var foo = new Foo();
module.execute('action', foo.bar); // foo.bar is the callback
。。。为什么bar()?为什么执行上下文没有被bind
调用更改?返回一个值-新绑定的函数-但您只是放弃该值Function.bind
不会改变this
(即其调用上下文),也不会改变其参数(this
)
还有其他方法可以得到同样的结果吗
在构造函数内部执行它实际上是错误的,因为bar
存在于Foo.prototype
上,所以将它绑定到Foo
的任何一个实例都会破坏所有其他Foo.bar
调用的此!按你的意思绑定:
或者——可能更简单——根本不在原型上定义bar
:
var Foo = function (arg) {
this.arg = arg;
function bar () {
console.log(this);
console.log(this.arg);
}
this.bar = bar.bind(this);
};
var foo = new Foo();
module.execute('action', foo.bar);
也就是说,我需要分配返回值?还有其他方法可以得到同样的结果吗?我不喜欢重新分配函数的想法…我会花一些时间完全理解你的答案,同时。。。真的谢谢你!除了Matt所说的,每次调用Foo
时,您都将绑定一个不同的this
。如果将函数调用为foo.bar
,那么为什么要使用bind
?另外,这个
不是“上下文”,它是函数的一个特殊值,是它们的一个参数,以及所有其他变量和作用域链。
var Foo = function (arg) {
this.arg = arg;
function bar () {
console.log(this);
console.log(this.arg);
}
this.bar = bar.bind(this);
};
var foo = new Foo();
module.execute('action', foo.bar);