假设我有一个这样的变量:
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);
对象)所以window
是params.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是简单的字符串
有办法解决这个问题吗?
答案 0 :(得分:1)
假设a
是一个函数(从您的问题中不清楚),那么您可以使用Function.bind
为所有调用设置上下文:
var a = (this.a || this.parent.a).bind(this);
有关详细信息和旧版浏览器的垫片,请参阅MDN。
答案 1 :(得分:1)