与Meteor.bindEnvironment一起使用后的函数上下文?

时间:2017-01-14 05:28:53

标签: javascript meteor

我最近遇到此代码的问题:

function doSth() {
  console.log(this);
}

const fWithMeteorEnv = Meteor.bindEnvironment(doSth);

fWithMeteorEnv.call({});  // expect to see a plain object in console

我期望在控制台中看到一个普通对象,但不是,它是另一回事。似乎Meteor.bindEnvironment阻止使用另一个上下文调用返回的函数。有什么方法可以解决这个问题吗?

2 个答案:

答案 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个参数,它返回的函数绑定到第三个参数。您需要在创建时对其进行绑定,并在其上使用applycall将传递参数,但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