2012-07-29 101 views
1
function get_denomination(){ 
    return "Fabrice Petard"; 
} 

function auto_flatterie(flatterie){ // 
    return this.get_denomination() + " est " + flatterie + " !"; 
} 

console.debug(auto_flatterie("le plus intelligent")); // affiche "Fabrice Petard est le plus intelligent !" 

你能解釋一下「this」綁定到什麼,以及爲什麼this.get_denomination不會拋出任何錯誤?請解釋爲什麼這個奇怪的javascript代碼工作

+2

請閱讀https://developer.mozilla.org/en/JavaScript/Reference/Operators/this。 – 2012-07-29 14:34:11

+0

這可能對您有所幫助http://www.robertsosinski.com/2009/04/28/binding-scope-in​​-javascript/,它正在討論您正在描述的案例 – Adi 2012-07-29 14:36:23

+2

您可能想要在['嚴格模式'](https://developer.mozilla.org/en/JavaScript/Strict_mode),其中[此代碼實際上會引發錯誤](http://jsfiddle.net/mYecU/)。嚴格模式還可以保護您免受諸如隱式全局變量等其他糟糕的語言決定。 – Esailija 2012-07-29 14:43:46

回答

3

在您發佈的代碼中,this是全球的window對象。在默認全局範圍中創建函數(如get_denomination)時,它將作爲屬性附加到window對象。

+0

只有當函數是全局的,它似乎是在這種情況下。 – 2012-07-29 14:36:14

+2

當我創建一個函數(...)時,我不是指'this',我指的是*,它被連接到'window'對象*,可以被理解爲*任何*函數變成全局對象的屬性,這是不正確的。沒有經驗的開發人員可能會發現這種混淆。 – 2012-07-29 14:40:01

+0

@FelixKling點採取。 – Dennis 2012-07-29 14:42:44

3

this綁定到window對象。方法get_denomination已註冊在window對象上。

+0

只有在這種情況下它似乎是全球性的。 – 2012-07-29 14:34:36

+1

是的,我想更大範圍的討論範圍將是一個更全面的答案,但我只想解釋當前的行爲。 – Candide 2012-07-29 14:35:41