1. 程式人生 > >JavaScript函式理解(一) -- 函式巢狀與閉包入門

JavaScript函式理解(一) -- 函式巢狀與閉包入門

   【巢狀函式】
  JavaScript允許在函式內部巢狀定義函式,允許函式用作資料錯位引數傳遞給另一個函式(JavaScript中所有函式都可以看做物件),並且在函式詞法作用域下面,可以產生與傳統面嚮物件語言不同的驚人地方。
  首先,JavaScript的函式是通過詞法來劃分作用域的,而不是動態的劃分作用域的,於是,函式的是在定義它們的作用域中執行,而不是在執行它們的作用域中執行,所以,當巢狀函式和它的外圍函式定義在同一個詞法作用域中的時候,是很容易理解的。

    1:在JavaScript中函式可以巢狀在另一個函式中進行定義(有點兒類似與Java中的內部類,機制有些不同--理解時可以進行類比學習,溫故而知新!)

function distance(x1, y1, x2, y2) {
    function square (x) {
        return x * x;
    }
    
    return Math.sqrt(square(x1 - x2) + square(y1 - y2));
}

var result = distance(0, 0, 3, 4);
console.log(result); // 5
在上面的程式碼片段中,函式distance中巢狀定義了函式square。這時,函式square只能在distance中被呼叫。如果我們想要在distance之外呼叫square函式,由於JavaScript中函式執行環境和變數作用域的限制,我們將得到一個很不友好的錯誤提示!

    2:結合巢狀函式更通俗易懂的理解一下JavaScript中的閉包:如果內部的巢狀函式使用了外部函式的變數或者引數,那麼內部函式就形成了一個閉包(Closure)。-- 閉包的具體理解在另一篇筆記裡面有記錄!

    閉包的特性:

    1):閉包能夠在起巢狀的外部函式執行完之後繼續訪問外部函式的變數和引數

 --這與JS的函式執行環境和變數作用域鏈有著密切關係。此處複習記憶一下。

     2):閉包中包含指向外部函式的引用

  --採用Chrome瀏覽器除錯時,可以很直觀的進行驗證。

     3):在閉包中想要在訪問外部函式的this物件時,需要我們在進入閉包之前就進行指定。通常的做法是在進入閉包之前宣告: var self = this; 在閉包中採用self引用外部函式的this物件。寫到這裡突然想來關於JS中的this指向問題,忘記上傳自己的筆記了,這裡先引用一篇文章‘深入淺出 JavaScript 中的 this

’,之後再補上自己的學習筆記。

     4):閉包有兩個比較常用的用途,一個是可以利用它訪問到區域性變數,另一個是可以把它外圍作用域中的變數值儲存在記憶體中而不在函式呼叫完畢後就銷燬。(別的還有諸如模擬私有變數和函式等等)。

-- 其實所有的JavaScript函式都可以說是閉包,但是只有當一個巢狀函式被匯出到它所定義的作用域之外時,這種閉包才是有趣的