[英]How can I scope this “public” method correctly?
我有這段代碼(JSFiddle)
var OBJ = function(){
var privateVar = 23;
var self = this;
return {
thePrivateVar : function() {
return privateVar;
},
thePrivateVarTimeout : function() {
setTimeout(function() { alert(self.thePrivateVar()); } , 10);
}
}
}();
alert(OBJ.thePrivateVar());
OBJ.thePrivateVarTimeout();
這是我遇到的一個實際問題的抽象。
所以-我希望對OBJ.thePrivateVarTimeout()
的調用要等待10
,然后用23發出alert
(我希望它可以通過其他公開的方法訪問)。
但是, self
似乎沒有正確設置。 當我設置self = this
看來this
不是一個參考功能,但對全局對象的引用。 為什么是這樣?
如何使公共方法thePrivateVarTimeout
調用另一個公共方法thePrivateVar
?
var OBJ = (function(){
var privateVar = 23;
var self = {
thePrivateVar : function() {
return privateVar;
},
thePrivateVarTimeout : function() {
setTimeout(function() { alert(self.thePrivateVar); } , 10);
}
};
return self;
}());
this === global || undefined
在調用的函數中this === global || undefined
。 在ES5中,無論全球環境如何,在ES5中嚴格來說它都是未定義的。
更常見的模式將涉及使用var that = this
作為函數中的局部值
var obj = (function() {
var obj = {
property: "foobar",
timeout: function _timeout() {
var that = this;
setTimeout(alertData, 10);
function alertData() {
alert(that.property);
}
}
}
return obj;
}());
或使用.bindAll
方法
var obj = (function() {
var obj = {
alertData: function _alertData() {
alert(this.property);
}
property: "foobar",
timeout: function _timeout() {
setTimeout(this.alertData, 10);
}
}
bindAll(obj)
return obj;
}());
/*
bindAll binds all methods to have their context set to the object
@param Object obj - the object to bind methods on
@param Array methods - optional whitelist of methods to bind
@return Object - the bound object
*/
function bindAll(obj, whitelist) {
var keys = Object.keys(obj).filter(stripNonMethods);
(whitelist || keys).forEach(bindMethod);
function stripNonMethods(name) {
return typeof obj[name] === "function";
}
function bindMethod(name) {
obj[name] = obj[name].bind(obj);
}
return obj;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.