js 中的閉包

2022-09-15 00:45:18 字數 1461 閱讀 1102

閉包:閉包是指有權訪問另乙個函式作用域中的變數的函式,建立閉包的常見方式是 在乙個函式內部建立另乙個函式

(從定義上講 js 中所有的函式都是閉包)

function

a()

returnb;}

var c=a();

c();

以上**的特點:            

1、函式b巢狀在函式a內部;

2、函式a返回函式b。

當函式a的內部函式b被函式a外的乙個變數引用的時候,就建立了乙個閉包。

閉包就是函式或**塊執行完後不**a中占用的資源,因為a的內部函式的執行需要依賴a中的變數

ps:全域性環境的變數物件始終存在,像函式中的區域性環境變數,則只在函式執行的過程中存在

作用域鏈本質上是乙個指向變數物件的指標列表,它只引用但不實際包含變數物件。

ps: 由於閉包會攜帶包含它的函式的作用域,因此會比其他函式占用更多的記憶體。過渡使用閉包可能會導致記憶體占用過多

所以,在本質上,閉包就是將函式內部和函式外部連線起來的一座橋梁。           

閉包的用處: 

a.讀取函式內部的變數。

b.讓這些變數的值始終保持在記憶體中。           

使用閉包的注意點

1)由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,

否則會造成網頁的效能問題,在ie中可能導致記憶體洩露。解決方法是,在退出函式之前,將不使用的區域性變數全部刪除。

2)閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式當作物件(object)使用,

把閉包當作它的公用方法(public method),把內部變數當作它的私有屬性(private value),

這時一定要小心,不要隨便改變父函式內部變數的值。

閉包容易造成的問題:  

function

a();

}(i); //若此處不傳入 i值 執行**後 獲取的值 都是 10

}  return

result;

}

var name = "the window";

var object =;

}};alert(object.getnamefunc()());

//"the window"(在非嚴格模式下)

object.getnamefunc()  執行後 返回的是乙個函式  後面的括號又執行了該函式 相當於該函式是在全域性環境中執行的。

在全域性環境中this 預設指向的是window物件

所以函式裡面的this.name  就是全域性的變數name

解決辦法:

我們知道,閉包的乙個作用就是讀取函式內部的變數。

如果要獲取本來的物件 可以將本來的this 儲存在另乙個自定義的變數中 然後將該變數傳入返回的函式裡面。

這樣該變數就會一直儲存在記憶體中 不會被銷毀

js 中的閉包

先理解 js 中的執行環境 閉包按中文的意思就是關上乙個包的意思。如果我們把函式的變數物件當做是乙個包的話,那這個詞很形象體現了它的作用 函式被呼叫時會建立它的執行環境,函式語句執行完後程式會自動銷毀這個函式的執行環境,但是當乙個函式中宣告了另乙個函式 子函式 並且如果存在對這個子函式引用,就會形成...

js中的閉包

閉包 英文 closure 1.閉包是乙個函式與作用域環境 即詞法環境 形成的閉包 2.閉包的理解 廣義的閉包 1.函式 2.這個函式能訪問到函式外部的狀態 也稱函式外部的變數 並不是我們平時理解的閉包 函式巢狀函式,並且內部函式通過return返回到外部,外部可以訪問內部函式的變數 總結 閉包 函...

JS中的閉包(Closure)

閉包是指有權訪問另乙個函式作用域中的變數的函式。最常見的就是在乙個函式內部建立另外乙個函式。以trialfunction 函式為例 function trialfunction property else if a1 b1 else 上述 中,內部函式訪問了外部函式中的變數property。即使這個...