閉包:最開始的解釋就是說函式套函式,巢狀(內部)函式對其容器(外部)函式是私有的。它自身就形成了乙個閉包。
function makefunc()
return displayname;
}var myfunc = makefunc();
myfunc();
makefunc()
建立了乙個區域性變數name
和乙個名為displayname()
的函式。displayname()
是定義在makefunc()
裡的內部函式,僅在該函式體內可被獲取;重點:閉包可以讓你從內部函式訪問外部函式作用域,所以說makefunc()就是乙個閉包。
在例子中,myfunc
是執行makefunc
時建立的displayname
函式例項的引用(因為makefunc() return displayname),而displayname
例項仍可訪問其詞法作用域(makefunc函式的作用域--根據宣告變數的位置來確定該變數可被訪問的位置 )中的變數,即可以訪問到name
。由此,當myfunc
被呼叫時,name
仍可被訪問,其值mozilla
就被傳遞到alert
中。
function makeadder(x) ;}var add5 = makeadder(5); //add5 = function(y);
var add10 = makeadder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12
我們定義了makeadder(x)
函式,它接受乙個引數x
,並返回乙個新的函式。返回的函式接受乙個引數y
,並返回x+y
的值
用閉包模擬私有方法 (如何使用閉包來定義公共函式,並令其可以訪問私有函式和變數)
var makecounter = function()
return ,
decrement: function() ,
value: function()
} };var counter1 = makecounter();
var counter2 = makecounter();
console.log(counter1.value()); /* logs 0 */
counter1.increment();
counter1.increment();
console.log(counter1.value()); /* logs 2 */
counter1.decrement();
console.log(counter1.value()); /* logs 1 */
console.log(counter2.value()); /* logs 0 */
利用閉包實現新新增的屬性(方法)--封裝新的方法,每呼叫乙個函式,都會有屬於自己的環境,各自互不干擾。
每個閉包都是引用自己詞法作用域內的變數privatecounter
。每次呼叫其中乙個計數器時,通過改變這個變數的值,會改變這個閉包的詞法環境。然而在乙個閉包內對變數的修改,不會影響到另外乙個閉包中的變數。
加一道閉包筆試題,每次執行列印的是多少?
function fun(n,o)}}var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1);
c.fun(2);
c.fun(3);
-------------------------------答案-------------------------------------
a //undefined 0 0 0
b //undefined 0 1 2
c //undefined 0 1 1
JS閉包理解
下圖例項 body ul li 1 li li 2 li li 3 li ul body html script vara document.getelementsbytagname li for vari 0 i a.length i i 如何從外部讀取區域性變數 functionvisitinn...
JS閉包理解
js閉包理解 在很多面試題中都會問什麼是js的閉包,為什麼需要使用閉包,使用閉包的優缺點!我在面試其他人的時候也喜歡問這個問題,回答的也是千奇百怪,現在就總結一下我對閉包的理解。閉包是一種概念,這種概念比較複雜,很多地方的定義不盡相同,我的理解是 閉包是能讀取函式內部變數的函式,也就是定義在函式內部...
js閉包理解
什麼是閉包?這兩天我在網上翻閱了大量的閉包理解部落格,有優秀的也有生搬硬套的。歸根揭底,還是理解的問題。我曾經聽老師講閉包後,還是一臉疑惑,然後下課去網上查閱資料,仔細研究之後知道是裡面要套乙個函式返回父級變數。這次我就講解一下個人理解的閉包。為什麼會出現閉包?首先,我們先想下,我現在需要乙個一直用...