2011-11-21 21 views
1

讓我們假設我有以下對象定義:jQuery的使用這個訪問對象上下文裏面的時候回調

var myObj = function(){ 
    this.hello = "Hello,"; 
} 

myObj.prototype.sayHello = function(){ 
    var persons = {"Jim", "Joe", "Doe","John"}; 
    $.each(persons, function(i, person){ 
     console.log(this.hello + person); 
    } 
} 

問題是,在$。每次這指的是人,但我想訪問obj屬性你好。

這是我能找到的唯一解決辦法是在聲明sayHello的功能類似

VAR _this =這一點;

,然後在$。每次我會用像

console.log(_this.hello + person); 

但不幸的是,這不是很好的代碼。有沒有另外一種方法來優雅地解決這個問題?

+0

變種人員= { 「吉姆」, 「喬」, 「Doe的」, 「約翰」 }; - 這是不正確的,你應該使用數組來代替。而且你並不真的需要$ .each這裏。 –

回答

3

那似乎並不是一個糟糕的解決方案......也許你會對使用Function.bind更感興趣(請參閱https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind#Compatibility以獲得兼容性),但這會導致反效果...

var myObj = function(){ 
    this.hello = "Hello,"; 
} 

myObj.prototype.sayHello = function(){ 
    var persons = ["Jim", "Joe", "Doe","John"]; 
    $.each(persons, function(i, person){ 
     console.log(this.hello + person); 
    }.bind(this)); 
} 

另一個解決方案是聲明變量和其值設置爲this.hello,像這樣:

var myObj = function(){ 
    this.hello = "Hello,"; 
} 

myObj.prototype.sayHello = function(){ 
    var persons = ["Jim", "Joe", "Doe","John"], 
     hello = this.hello; 
    $.each(persons, function(i, person){ 
     console.log(hello + person); 
    }); 
} 
+0

非常感謝你的回答,我和一個認爲他是jquery中的大師的人吵了一架,他說我的解決方案是不好的代碼。現在有3個人證實了我已經知道的東西,我對自己的知識感覺更舒適。 – user253530

0

如果您未在$ .each範圍之外定義該變量,則無法找到它。你必須在你的$ .each函數外部進行定義,以便調用。否則它將是一個未定義的對象。

如果要定義一個參考,請查閱以下網址:Pass additional parameters to jQuery each() callback

3

校正的例子,在正確設置satisfyng您的需求,這是

myObj.prototype.sayHello = function(){ 
var persons = ["Jim", "Joe", "Doe","John"]; 
persons.forEach(function(person){ 
    console.log(this.hello + person); 
},this); 
} 

Check out Array.forEach for more info.

相關問題