我最近遇到此代码的问题:
function doSth() {
console.log(this);
}
const fWithMeteorEnv = Meteor.bindEnvironment(doSth);
fWithMeteorEnv.call({}); // expect to see a plain object in console
我期望在控制台中看到一个普通对象,但不是,它是另一回事。似乎Meteor.bindEnvironment
阻止使用另一个上下文调用返回的函数。有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
我认为您尝试实现的目标是不可能的,即您需要在调用Meteor.bindEnvironment
时绑定您的上下文。您可以使用.bind()
来完成此操作,例如
const fWithMeteorEnv = Meteor.bindEnvironment(doSth.bind(context));
或者您可以将上下文作为第三个参数传递给Meteor.bindEnvironemnt()
,例如
const fWithMeteorEnv = Meteor.bindEnvironment(doSth, null, context);
第二个参数是异常回调。
答案 1 :(得分:2)
Meteor.bindEnvironment(func, onException, _this)
接受3个参数,它返回的函数绑定到第三个参数。您需要在创建时对其进行绑定,并在其上使用apply
或call
将传递参数,但this
引用将被覆盖。
function doSth() {
console.log(this.foo);
}
const fWithMeteorEnv = Meteor.bindEnvironment(doSth, null, {foo: 'foo'});
fWithMeteorEnv.call({foo: 'bar'}); // will print 'foo'
这与Function.prototype.bind
所期望的相似。您不应期望call
绑定函数并将其this
上下文作为您的参数。
let f = function() {
console.log(this);
}.bind({foo:'foo'});
f.call({foo: 'bar'}); // will log `{foo: 'foo'}`.
如果你真的需要为某个函数设置this
上下文,你可以将它包装起来并作为参数传递给包装函数(例如,使用包装器的第一个参数作为{{1原始函数的上下文)。
如果你需要同时拥有返回函数的this
语义,那么可以以相当复杂的方式完成。
call