请解释为什么这个奇怪的javascript代码工作

问题描述:

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

在您发布的代码中,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

this绑定到window对象。方法get_denomination已注册在window对象上。

+0

只有在这种情况下它似乎是全球性的。 – 2012-07-29 14:34:36

+1

是的,我想更大范围的讨论范围将是一个更全面的答案,但我只想解释当前的行为。 – Candide 2012-07-29 14:35:41