2009-07-13 124 views
-2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
     <title>test</title> 

    </head> 
    <body> 
     <script type="text/javascript" charset="utf-8"> 
      (function(){ 
       // this 
       var test=function(){ 
        //this 
        return function(){ 
         //this 
        }; 
       } 

       (function(){ 
        //this 
        var a={ 
         p1:function(){ 
          //this 
         } 
        }; 
       })(); 
      })(); 
     </script>  
    </body> 
</html> 
+5

請注意,使用Javascript包含可能比廣告宣傳不太簡單。條款和條件適用。優惠在加拿大無效。 – Greg 2009-07-13 10:27:16

+2

只是copy'n粘貼一些代碼不構成一個很好的問題。 -1 – Boldewyn 2009-07-13 10:40:05

回答

13

David Dorward已經提到過關於JavaScript的內容:The Good Parts by Douglas Crockford。

從這一優良書的第4.3節:

調用一個函數掛起 執行當前函數, 傳遞控制和參數到 新的功能。除了聲明的參數 之外,每個函數 還接收兩個附加參數: this和arguments。此參數 在面向對象 編程中非常重要,其值爲 ,由調用模式確定。 JavaScript中有四種調用模式 :方法調用 模式,函數調用 模式,構造函數調用 模式和應用調用 模式。 初始化的獎勵參數 的模式不同。

Crockford的繼續的「這個」在每個這些模式,如下所示來說明綁定:

方法調用圖形:當一個函數被存儲爲對象的屬性,我們稱它是一種方法。當一個方法被調用時,這個綁定到該對象。

函數調用模式:當使用此模式調用函數時,該函數被綁定到全局對象。這是該語言設計中的一個錯誤。

構造函數調用模式:如果一個函數被調用,有新的前綴,那麼一個新的對象將與一個隱藏的鏈接功能的原型成員的價值創造,這將綁定到新對象。

應用調用模式: apply方法讓我們構造一個用於調用函數的參數數組。它也讓我們選擇這個價值。 apply方法有兩個參數。第一個是應該綁定到這個的價值。第二個是一組參數。

1
其他

this是評論

在作用域鏈意義上,它會從this在底部功能將所有的方式回到全球this

例如這

p1:function(){ 
     //this 
    } 

那麼這個上面它

(function(){ 
    //this 
    var a={ 
    p1:function() 

然後它上面

(function(){ 
    // this 
    var test=function(){ 

有尼古拉斯Zakas一個良好的演示文稿在雅虎this它在http://www.youtube.com/watch?v=mHtdZgou0qU

4

this的含義取決於包含它的函數如何被調用,而不是它是如何構造的

JavaScript: The Good Parts中有一個很好的解釋。

簡短的說法是,當您調用函數(m)作爲對象(o)的方法時,那麼thiso

var o = { 
    m: function() { 
     return this; 
    } 
} 

var foo = { 
    bar: o.m; 
} 

o === o.m(); 
foo === foo.bar(); 
0

最好看看javascript關閉,瞭解範圍和這個指針分配。 「這個」甚至在面向對象編程之前就已經出現,但對於它來說絕對是必不可少的。

http://jibbering.com/faq/notes/closures/

這在很大程度上取決於範圍鏈的作用,標識符 分辨率等屬性名稱的對象上的分辨率。

封閉的簡單解釋是ECMAScript允許內部的 函數;函數定義和函數表達式,其中 在其他函數的函數內。


與 聲明的局部變量變量實例化期間被初始分配未定義值 對應的可變對象上創建的特性,局部 變量的實際初始化並不發生,直到的評價在執行功能體代碼期間對應的 賦值表達式。

這是一個事實,即激活對象,以其參數 屬性,和可變對象,具有與功能的局部變量對應 命名屬性,是同一個對象,其允許 標識符參數被處理,就好像這是一個函數局部變量 。

最後,分配一個值用於此關鍵字。如果 賦值指向一個對象,那麼屬性訪問器將 作爲該對象的該關鍵字引用屬性的前綴。如果 值(內部)爲空,則此關鍵字將引用 到全局對象。

全局執行上下文與 獲得一些稍微不同的處理,它沒有參數,因此它不需要定義的激活 對象來引用它們。全局執行上下文確實需要一個 作用域,其作用域鏈恰好由一個對象組成,全局對象爲 。全局執行上下文確實通過變量 實例化,其內部函數是構成大量JavaScript代碼的正常頂層函數 聲明。全局對象 用作變量對象,這就是全局聲明的 函數成爲全局對象的屬性的原因。正如全球 所聲明的變量。

全局執行上下文還使用對此對象的全局對象 的引用。 禮貌http://jibbering.com/faq/notes/closures/ 章:標識符解析,執行上下文和範圍鏈