使用电话和申请房产?

时间:2012-12-19 21:03:20

标签: javascript properties this

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

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

可以设置a的上下文(通过上下文我的意思是'this',也许'范围'是一个更好的词......),就像使用.call()或{{1}时一样对于函数?

修改

我有一个给出值返回的辅助函数:

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

这是代码:

.apply()

unwrapValue位于普通对象(Utils)中,并且从该对象外部调用:

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

现在,我在函数中有一个属性Utils.unwrapValue(value); (可能是函数或其他函数):

url

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

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

问题出在这里,unwrapValue返回this.url,但将'this'设置为其他东西(我认为它是Utils对象但由于某种原因它是var params = {}; params.url = Utils.unwrapValue(this.url); 对象)所以windowparams.url这不是我想要的。

如果window.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将设置为this

有了这个问题,我正在寻找一种方法来使用context,因为context不是像以下那样的函数:

value

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

有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

假设a是一个函数(从您的问题中不清楚),那么您可以使用Function.bind为所有调用设置上下文:

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

有关详细信息和旧版浏览器的垫片,请参阅MDN

答案 1 :(得分:1)

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

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

由于你没有传递进一步的论点,你也可以使用apply代替call