Javascript:看 Javascript 規范,學 this 引用,你會懂的。


背景

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 規則:

  1. 是一個內部結構,不能用作變量或屬性在值。
  2. 這個結構包含兩部分:base object 和 property name。
  3. 可以用來解釋 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。

括號的規范

賦值的規范

逗號的規范

備注

再次印證了一個道理,官方永遠是最好的教程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM