0

假设我有一个这样的变量:

var a = this.property || this.parent.anotherProperty;

a可以在使用.call().apply()函数时设置上下文(通过上下文我的意思是“this”,也许“范围”是一个更好的词......) ?

编辑:

我有一个辅助函数,它给出了一个返回值:

  • 如果值是一个函数 -> value()
  • 如果它不是函数 -> 值

这是代码:

function unwrapValue(value){
   return typeof value === 'function' ? value() : value; 
}

unwrapValue 在一个普通对象(Utils)内,它是从这个对象外部调用的:

Utils.unwrapValue(value);

现在,我url在函数中有一个属性(可能是函数或其他东西):

this.url = this.baseUrl || this.collection.baseUrl;

我不知道 this.url 是函数还是其他东西,所以我使用 unwrapValue 来获取 url 的值:

var params = {};
params.url = Utils.unwrapValue(this.url);

问题就在这里,unwrapValue 返回 this.url 但将 'this' 设置为其他东西(我认为它是 Utils 对象,但由于某种原因它是window对象)所以params.urlwindow.baseUrl || window.collection.baseUrl不是我想要的。

如果value是我这样解决的函数:

function unwrapValue(value, context){
    if(typeof value === 'function'){
        return typeof context === 'undefined' ? value() : value.call(context);
    }else{
        return value;
    }
}

因此,如果将第二个参数context传递给unwrapValue,则 valuethis将设置为context

带着这个问题,我正在寻找一种context在这种情况下使用 aslo 的方法value不是这样的功能:

this.url = this.baseUrl || this.collection.url;

只是为了澄清一点: this.baseUrl 和 this.collection.url 是简单的字符串

有办法解决吗?

4

2 回答 2

1

假设这a是一个函数(您的问题尚不清楚),那么您可以使用它Function.bind来设置对其进行的所有调用的上下文:

var a = (this.a || this.parent.a).bind(this);

有关更多信息,请参阅MDN和旧浏览器的 shim。

于 2012-12-19T21:09:32.293 回答
1

您可能希望将对象文字作为thisArg 传递给该函数:

function fn() {
    var a = this.a || this.parent.a;
    console.log(a);
}
fn.call({
    a: false,
    parent: {
        a: "foobar"
    }
});

由于您没有传递更多参数,因此您可以使用applyas well 代替call.

于 2012-12-19T21:21:55.810 回答