背景
Javascript 的 this 是我的心病,多數情況下知道其運行結果,個別變態的場景下,就給不出解釋了,昨天一次偶然的機遇讓我有興趣嘗試看一看 Javascript 語言規范,一看就悟了。
偶然的機遇就是一篇文章:http://www.cnblogs.com/aaronjs/p/3339107.html,這篇文章中關於 this 的部分我錯了1/4。
this
待分析程序
1 var x = 10; 2 var foo = { 3 x: 20, 4 bar: function () { 5 var x = 30; 6 return this.x; 7 } 8 }; 9 10 console.log( 11 foo.bar(), // 1. 12 (foo.bar)(), // 2. 13 (foo.bar = foo.bar)(), // 3. 14 (foo.bar, foo.bar)() // 4. 15 );
先看一個語言規范
Reference Type 規則:
- 是一個內部結構,不能用作變量或屬性在值。
- 這個結構包含兩部分:base object 和 property name。
- 可以用來解釋 this (本文的目的)。
方法調用
方法可以使用 new 調用、使用 apply 調用、使用 call 調用和常規調用,這里我們只解釋常規調用。
xxx() 中的 this 指向什么呢?這里得看 xxx 的返回類型是什么,如果是 Reference Type,this 就指向 Reference Type 的 base object,否則就指向 window(根據宿主而定)。
再看一下上面的例子:
1 console.log( 2 foo.bar(), // 1. 3 (foo.bar)(), // 2. 4 (foo.bar = foo.bar)(), // 3. 5 (foo.bar, foo.bar)() // 4. 6 );
1 和 2 返回的是Reference Type,因此輸出為 20,3 和 4 返回的是function object,因此輸出的是 10。
括號的規范
賦值的規范
逗號的規范
備注
再次印證了一個道理,官方永遠是最好的教程。