我有一个IIFE,其中定义了一些方法,一些是公开的,一些不是。
在很多函数中(包括私有函数)我使用'this'关键字,所以显然为了确保我在正确的上下文中,我需要使用.call(this)
方法。有没有办法将IIFE内的所有函数绑定到正确的上下文,而不必使用call()
?
定义var self=this
不是一个选项,因为它弄乱了Knockout上下文。
ko.utils.extend(SingleSelectDropdownViewModel.prototype, (function () {
var STRINGS = {
All: l10n('All')
};
//Public Functions
var init = function (params) {
this.selectedValue = params.selectedValue;
this.title = ko.observable();
this.items = params.items;
this.menuOpen = ko.observable(false);
//would like to avoid using call and just use _setTitle()
_setTitle.call(this);
},
...
//Private Functions
_setTitle = function(){
if (ko.unwrap(this.selectedValue)){
var i = util.index(this.items(),ko.unwrap(this.selectedValue),'id');
i = i > -1 ? i : 0;
this.title(this.items()[i].text);
}
else {
this.title(this.items()[0].text);
}
},
_hideMenu = function(){
this.menuOpen(false);
},
...
return {
init: init
};
})());
答案 0 :(得分:1)
我建议您坚持只在函数中使用this
,这些函数实际上是对象的方法,并且在其余时间使用函数参数。如果您这样做,您的代码将变为:
ko.utils.extend(SingleSelectDropdownViewModel.prototype, (function () {
var STRINGS = {
All: l10n('All')
};
//Public Functions
var init = function (params) {
this.selectedValue = params.selectedValue;
this.title = ko.observable();
this.items = params.items;
this.menuOpen = ko.observable(false);
//would like to avoid using call and just use _setTitle()
_setTitle(this);
},
...
//Private Functions
_setTitle = function (obj) {
if (ko.unwrap(obj.selectedValue)){
var i = util.index(obj.items(),ko.unwrap(obj.selectedValue),'id');
i = i > -1 ? i : 0;
obj.title(obj.items()[i].text);
}
else {
obj.title(obj.items()[0].text);
}
},
_hideMenu = function(obj){
obj.menuOpen(false);
},
...
return {
init: init
};
})());