關于this和self的使用說明
更新時間:2010年08月01日 17:41:12 作者:
剛接觸python的時候,最不習慣的事情,就是每個方法都要加一個self。無論Javascript還是C#,都直接一個this搞定,干嘛非要加一個變量self。
前兩天在寫一個chrome的extensions,因為 content里和background交互必需要一個異步方法實現(xiàn),如:
var Test = new Class({
options: {},
initialize: function(args) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
……
});
}
});
這個this應該是Test這個對象,但是回調方法里是空的。難道要把this做參數傳過去,再call回來?還好,mootools里有個好方法,bind。
var Test = new Class({
options: {},
initialize: function(args) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
……
}.bind(this));
}
});
這下OK了,繼續(xù)寫:
var Test = new Class({
options: {},
initialize: function(args) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
$each(this.options, function(o, i) {
if (o == '1') {
this.fun1();
} else {
this.fun2();
}
}.bind(this));
}.bind(this));
},
fun1: function {},
fun2: function {}
});
就算有bind也不容易分清哪個this是什么了。而真實的代碼比這個要恐怖的多,有的情況下,我們的確需要this指向其它的變量,而不是這個類。
最常用的解決方法,是這樣:
var Test = new Class({
options: {},
initialize: function(args) {
var _self = this;
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
_self.options = options;
$each(_self.options, function(o, i) {
if (o == '1') {
_self.fun1();
} else {
_self.fun2();
}
});
});
},
fun1: function {},
fun2: function {}
});
我特別定義了一個_self的變量來代替this,這看起來象什么?python!
現(xiàn)在終于體會到python的self絕對不是多此一舉。
復制代碼 代碼如下:
var Test = new Class({
options: {},
initialize: function(args) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
……
});
}
});
這個this應該是Test這個對象,但是回調方法里是空的。難道要把this做參數傳過去,再call回來?還好,mootools里有個好方法,bind。
復制代碼 代碼如下:
var Test = new Class({
options: {},
initialize: function(args) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
……
}.bind(this));
}
});
這下OK了,繼續(xù)寫:
復制代碼 代碼如下:
var Test = new Class({
options: {},
initialize: function(args) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
$each(this.options, function(o, i) {
if (o == '1') {
this.fun1();
} else {
this.fun2();
}
}.bind(this));
}.bind(this));
},
fun1: function {},
fun2: function {}
});
就算有bind也不容易分清哪個this是什么了。而真實的代碼比這個要恐怖的多,有的情況下,我們的確需要this指向其它的變量,而不是這個類。
最常用的解決方法,是這樣:
復制代碼 代碼如下:
var Test = new Class({
options: {},
initialize: function(args) {
var _self = this;
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
_self.options = options;
$each(_self.options, function(o, i) {
if (o == '1') {
_self.fun1();
} else {
_self.fun2();
}
});
});
},
fun1: function {},
fun2: function {}
});
我特別定義了一個_self的變量來代替this,這看起來象什么?python!
現(xiàn)在終于體會到python的self絕對不是多此一舉。
相關文章
JavaScript async&await方法中的異常處理方案
在 async/await 方法中,可以使用 try-catch 塊來處理異常,通過使用 try-catch,可以捕獲異步操作中拋出的異常,并在 catch 塊中進行適當的處理,本文給大家詳細介紹了async&await方法中異常如何處理,需要的朋友可以參考下2023-08-08利用JavaScript在網頁實現(xiàn)八數碼啟發(fā)式A*算法動畫效果
這篇文章主要介紹了利用JavaScript在網頁實現(xiàn)八數碼啟發(fā)式A*算法動畫效果,需要的朋友可以參考下2017-04-04