js閉包例項彙總

2022-09-16 19:42:18 字數 3384 閱讀 5231

本文是通過例項來幫助大家深刻理解js閉包,是篇非常不錯的文章,這裡推薦給大家,有需要的小夥伴可以參考下

js閉包

閉包前要了解的知識

1. 函式作用域

(1).js語言特殊之處在於函式內部可以直接讀取全域性變數

複製** **如下:

<

script

type

="text/j**ascript"

>

varn

=100

;function

parent()

parent();

//100

script

>

如果在php裡

複製** **如下:

<?

php$n=100;

function parent()

parent();//會報錯 n未定義

?>

(2).在函式外部無法讀取函式內的區域性變數

複製** **如下:

<

script

type

="text/j**ascript"

>

function

parent()

parent();

alert(m);

//報錯 m未定義

script

>

注意函式內部宣告變數時一定要加var,否則就宣告了乙個全域性變數

複製** **如下:

function parent()

parent();

alert(m);//50

//當然在php裡更是如此了,

複製** **如下:

<?

phpfunction parent()

parent();

echo $m;//50

?>

//沒global的話,一樣會報沒定義的錯誤

有時,需要得到函式內部的的區域性變數,就需要變通的方法實現利用js變數作用域的特點,如在函式內部定義子函式,對於子函式來說,父函式就是它的全域性,子函式可以訪問父函式裡的變數(對於整個js**來說又是區域性變數)

複製** **如下:

<

script

type

="text/j**ascript"

>

function

parent()

return

son;

}vars=

parent();

//將結果儲存在全域性裡

s();

//50

script

>

parent內部所有區域性變數對其子函式來說都是可見的,但其子函式內的區域性變數對其父函式是不可見的,這就是js特有的鏈式作用域結構,子物件會一級一級地向上查詢所有父物件的變數,父物件的所有變數對子物件都是可見的,反之不成立!上面的son函式就是閉包

有些同學可能這樣

複製** **如下:

function parent()

}parent();

son()//會報 函式son未定義

注意 在j**ascript裡,在函式裡宣告的函式都是區域性的,函式執行完後就釋放了

注意這點與php的區別

複製** **如下:

<?

phpfunction parent()

}parent();

son();//輸出50 不會報錯

?>

閉包函式內部定義函式,連線函式內部和外部的橋梁

閉包的作用有2個:

一是前面提到的讀取函式內部的變數,

二是讓這些變數的值儲存在記憶體中,實現資料共享

下面是幾個閉包的例子

複製** **如下:

<

script

type

="text/j**ascript"

>

varcnt=(

function

()})();

cnt();//0

cnt();//1

cnt();//2

cnt();//3

script

>

把匿名函式的執行結果(即對裡面子函式的宣告賦給全域性變數cut),i就儲存在記憶體裡了

執行cut()時就直接從記憶體取值了,i只有cnt()函式才能呼叫,直接alert(i)是不行的

還可以向閉包內傳參

複製** **如下:

var cnt=(function(num)

})(5);

cnt();//5

cnt();//6

cnt();//7

//當然還可以呼叫時傳參

var cnt=(function()

})();

cnt(1);//1

cnt(2);//3

cnt(3);//5

為了對閉包有更好的理解,我們看以下**

比如我想返回乙個陣列,陣列裡面有5個函式,第乙個函式彈出0,第二個彈出1...

**如果這樣寫

複製** **如下:

function box()

}return arr;

}var a

=box();

alert(a);//包含五個函式體的陣列

alert(a[0]());

alert(a[1]());

彈出的函式體

function() }

最後這個i是4,之後++成為5

for迴圈停止

發現均彈出5,明顯不符合我們的要求

解決方案1

自我即時執行裡面的函式

複製** **如下:

function box())(i);

}return arr;

}var a

=box();

for(var i

=0;ialert(a);

}但是我們發現 返回的陣列裡的元素是函式執行的結果,但我們想要的是函式有得公升級我們的**

解決方案2

閉包實現

複製** **如下:

function box()

})(i);

}return arr;

}var arr

=box();

for(var i

=0;i<5;i++)

關鍵**

複製** **如下:

arr=(function(num)

})(i);

i=0

時 arr[0]

=(function(num)})(0);

1時arr[1]

=(function(num)})(1);

以上就是閉包的好處!非常簡單實用吧。

js 閉包例項

var db function 建立乙個函式,這個函式提供一些訪問data的資料的方法 return function key,val getelse set 我們可以呼叫這個匿名方法 返回這個內部函式,它是乙個閉包 db x 返回 undefined db x 1 設定data x 為1 db x...

js 閉包例項

var db function 建立乙個函式,這個函式提供一些訪問data的資料的方法 return function key,val getelse set 我們可以呼叫這個匿名方法 返回這個內部函式,它是乙個閉包 db x 返回 undefined db x 1 設定data x 為1 db x...

JS經典閉包例項

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,b,c的輸出分別是什麼?首先來看第一行 var ...