**
前面學了這麼多知識,今天就來看看匿名函式和閉包吧! 想要學習閉包先來看看什麼是匿名函式吧! (一)匿名函式 匿名函式就是沒有名字的函式。他有兩種宣告方式: 1.典型的函式宣告: function functionname(arg0,arg1,arg2) 2.函式表示式: var functionname = function(arg0,arg1,arg2) 雖然這兩種方式在邏輯上市等價的,但是他們還是存在區別的。 區別1:前者會在**執行以前被載入到作用域中,而後者則是在**執行到那一行的時候才會有意義。 區別2:前者會給函式指定乙個名字,而後者則是建立乙個匿名函式,然後將這個匿名函式賦給乙個變數。 換句話說上面第二個例子:建立了乙個帶有3個引數的匿名函式,然後把這個匿名函式賦給了變數
functionname
,並沒有給匿名函式指定名字。
(二)閉包 書上定義是這麼說的:指有權訪問另乙個函式作用域中的變數的函式 可是這種說法令新手難以理解。
其實,在本質上,閉包就是將函式內部和函式外部連線起來的一座橋梁。 1.那我先來說說為什麼要有閉包這麼個概念吧,它產生的意義是什麼呢? (1)首先我們學過前面的作用域了,知道了乙個概念:
函式內部可以直接讀取全域性變數。 那麼看**: var n=999;
function f1()
f1(); // 999
(2)然後另外乙個概念:在函式外部自然無法讀取函式內的區域性變數
那麼再看**:
function f1()
alert(n); //輸出錯誤
(3)這裡有乙個地方需要注意,函式內部宣告變數的時候,一定要使用var命令。如果不用的話,你實際上宣告了乙個全域性變數!(我們以前也提到過的!)
function f1()
f1();
alert(n); // 999
下面關鍵的來了!
:那就是如何從外部讀取區域性變數呢?
那就是在函式的內部,再定義乙個函式。(也就是閉包!!)
function f1()
}在上面的**中,函式f2就被包括在函式f1內部,這時f1內部的所有區域性變數,對f2都是可見的。但是反過來就不行,f2內部的區域性變數,對f1就是不可見的。既然f2可以讀取f1中的區域性變數,那麼只要把f2作為返回值,我們不就可以在f1外部讀取它的內部變數了嗎!來看**:
function f1()
return f2;
}var result = f1();
result(); //999
這段**與上面的不同點就是把f2函式作為了乙個返回值,然後在呼叫它。這時你肯定在想最後兩行什麼意思啊?其實開始我也沒鬧明白,經過高人指點,其實這最後兩行的意思就是要呼叫f2這個函式的返回值。這兩行如果我改寫一下是不是更容易明白了呢?
var result = f1();
result();
合併成為:
f1()()
;其實結果是一樣的
也可以更好的說明f2這個閉包的作用是:通過把它作為返回值(因為它能訪問函式f1內的區域性變數),然後從全域性環境中呼叫這個返回值,這樣自然就達到了我們的目的---
從全域性作用域中讀取區域性函式內的變數!
2.既然知道了閉包的意義,下面就來了解下閉包的用途吧!
(1)閉包的第乙個用途,其實上面已經提到了,就是產生它意義:可以讀取函式內部的變數
(2)閉包的第二個用途,那就是:
可以讓這些變數的值始終保持在記憶體中
第二個用途怎麼理解呢?來看**:
function f1()
function f2()
return f2;
}var result=f1(); //把f1函式
的返回值(而這個返回值是函式f2的形式
)給result
result(); // 999 輸出這個f2的返回值
nadd();
//呼叫nadd函式
result(); // 1000 這裡就是閉包的第二個用途:f2這個閉包會讓變數n的值始終儲存在記憶體中
光靠**來理解第二種用途,好像沒有什麼說服力,下面就用畫圖的方法來讓大家更深刻的理解!!
第二種用途其實就和作用域鏈產生聯絡了
,我來解釋下:
閉包f2從f1函式中被返回後,它的作用域鏈被初始化為包含f1函式的活動物件和全域性變數物件(黑線部分)。這樣f2就可以訪問在f1()函式中定義的所有變數。更為重要的是就算f1()被執行完畢後,它的活動物件也不會被銷毀,因為如圖f2這個閉包還在引用f1函式的活動物件,這也就是為什麼上述第二種用途的原因:閉包會讓變數始終儲存在記憶體中,直到閉包被摧毀。
js 關於閉包和匿名函式
關於js閉包。之前我一直以為是匿名函式,以為封閉式的建立即執行銷毀就是閉包,其實這是匿名函式,不一樣的。也沒有閉包的使用經驗。後來去網上查了下才知道,閉包的意思是 函式內部還有函式,返回乙個函式,內部函式可訪問外部函式的變數。乙個最簡單的案例 a是外部函式,b是內部函式,b可以使用a的變數i,呼叫a...
js 匿名函式 閉包前奏
js裡面 萬物皆物件 函式同理 三種定義方式 a.傳統的如同c語言一樣的定義方式 function abc b.少見的定義方式 var abc new function 引數 由此可見我們的function是建構函式function的物件例項,即函式也是物件 c.匿名函式定義 var abc fun...
匿名函式和閉包
匿名函式 匿名函式和普通函式 function box alert box 閉包概念 閉包是指有權訪問另乙個函式作用域中的變數的函式,建立閉包的常見的方式,就是在乙個函式內部建立另乙個函式,通過另乙個函式訪問這個函式的區域性變數。閉包作用 使用閉包有乙個優點,也是其缺點。可以把區域性變數駐留在記憶體...