以前說過閉包就是把函式當作返回值,和把函式當作引數,這兩種清況就是閉包,那麼為什麼要把函式當作返回值呢?先看個例子:
function
f1()
console.log
(n);
結果是:
n is
not defined
但是如果寫成下面這種形式:
function
f1()
return f2;
}var result = f1();
result();
這樣就可以訪問到n了
這是因為函式有乙個作用域鏈的問題,具體可以看我寫的前面的幾篇文章,在函式內部沒有的屬性,他會一直向上查詢,在這裡在f1的內部,f2是可以訪問到f1的屬性的,所以我們就要把f2當作f1的返回值,這樣我們就可以在外面訪問到f1裡面的屬性了。
這個就是閉包:把函式定義在另乙個函式裡面
閉包就是連線函式和外面的一坐橋梁。
先看下面乙個例子,然後我們會得出閉包的乙個注意要點:
function
f1()
function
f2()
return f2;
}var result = f1();
result();
add();
result();
這裡的執行結果是99和100,為什麼呢?在第一次執行完之後,並沒有清除f1和f2的值,而是在記憶體中儲存了下來,因為result是乙個全域性變數,把f1給了他也就是f2給了他,但是f2的存在是依賴於f1的,所有他們都在記憶體當中,而add這個因為沒有用var宣告,所以它是全域性變數,指向了乙個匿名函式,所以他的執行,會影響n的值。通過以上的分析,我們可以得出:
使用閉包是比較消耗記憶體的在一般頁面使用可以,在是在比較大型的專案,有可能引起網頁的效能問題。在ie中有可能導致記憶體洩漏,解決辦法是在退出函式之前,將不使用的區域性變數全部清除。
閉包的一些
由於閉包包含之前的執行環境,所以以下的i指向同乙個i function createfunctions return result var fuk createfunctions for var i 0 i fuk.length i 10 10 10.解決方式 function createfunc...
JS中的閉包的一些理解!
在日常的開發中,基本上是不會遇到關於閉包的這樣,但是,因為在一些特殊的情況下,必須採用閉包,所以這裡簡單的概述下什麼是閉包 ok!簡而言之,閉包只是乙個名詞而已,我們更注重於他所實現的功能,也就是我們可以 在外部獲取內部的區域性變數,我們都知道,我們每定義乙個變數都會有其自己的變數作用域,全域性變數...
Js函式閉包的理解及閉包存在一些問題的解決
可以在函式外部讀取函式內部成員 讓函式內成員始終存活在記憶體中 閉包的問題 var arr for var i 0 i 10 i 應該是輸出對應下標 arr 0 11 arr 1 11 arr 2 11 這個 只是想實現根據arr下標,console.log出相應的值。但是當呼叫時,for迴圈中的i...