javascript,jquery閉包概念分析
更新時(shí)間:2010年06月19日 00:03:45 作者:
偶爾聽人說javascript閉包,讓我聯(lián)想起以前學(xué)編譯原理和數(shù)字邏輯里講的閉包,以前上課講的閉包很難懂,而且含有遞歸的意思在里面,現(xiàn)在不想再查看里面的閉包概念。
但javascript我是經(jīng)常要用,所以是要懂這里面的概念。
其實(shí)javascript里的閉包概念很簡(jiǎn)單,就是函數(shù)用到外部變量,不需要傳參就可以獲取。
舉個(gè)例子:
<script>
var sMessage = "Hello world";
function sayHello(){
alert(sMessage);
}
sayHello();
addNumber(1,2);
var iBaseNum = 10;
function addNumber(iNum1, iNum2) {
function doAddition() {
alert(iNum1 + iNum2 + iBaseNum);
}
return doAddition();
}
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
c();
</script>
第一個(gè)函數(shù)sayHello沒有傳參數(shù),直接利用了sMessage變量,這個(gè)就叫做閉包。
第二個(gè)函數(shù)復(fù)雜點(diǎn),里面有個(gè)doAddition也是閉包函數(shù),他不需要參數(shù),直接在執(zhí)行環(huán)境中獲取iNum1,iNum2,還有外部變量 iBaseNum。
第三個(gè)函數(shù) 是能保護(hù) i變量的訪問,并且一直保存i在內(nèi)存中,可以一直增加。(閉包的一個(gè)經(jīng)典用法)
jquery中閉包也差不多,先給個(gè)例子
你也許會(huì)問
(function($){
$("div p").click(function(){alert("cssrain!")});
})(jQuery); //一個(gè)閉包
這是什么寫法?。?
別急,我也是請(qǐng)教了upc ,才稍微懂了點(diǎn)。
這里面的$只是形參,但jquery是全局變量,所以不需要調(diào)用該函數(shù)就會(huì)自動(dòng)執(zhí)行,或者分兩步
就是轉(zhuǎn)化成正常的函數(shù),先寫函數(shù),后調(diào)用。
如下所示
其實(shí):
(function($){
$("div p").click(。。。);
})(jQuery);
就是等于
function tempFunction($){ //創(chuàng)建一個(gè)以$為形參的函數(shù)
$("div p").click(....);
}
TempFunction(jQuery); //傳入實(shí)參jQuery執(zhí)行函數(shù).
干脆直接這么寫 ,算了
(function(cssrain){
cssrain("div p").click(.... );
})(jQuery); //一個(gè)閉包
閉包的基本寫法:
(function(){do someting})();
//這個(gè)你就理解為定義一個(gè)匿名函數(shù)并立即執(zhí)行
帶參數(shù)的話就這樣:
(function(形參){do someting})(實(shí)參);
另外
(function(){var upc="i am upc"})();
alert(upc);
會(huì)提示undefined。
因?yàn)殚]包后,里面的變量就相當(dāng)于局部了。
閉包的好處:
不增加額外的全局變量,
執(zhí)行過程中所有變量都是在匿名函數(shù)內(nèi)部。
上面的例子不是很好,跟javascript的閉包有點(diǎn)混淆,但這確實(shí)也是jquery中的一種閉包。只不過經(jīng)過jquery的加工罷了。
如過有什么不對(duì),大家互相討論,我也是初學(xué)者,還有很多不懂得地方。
其實(shí)javascript里的閉包概念很簡(jiǎn)單,就是函數(shù)用到外部變量,不需要傳參就可以獲取。
舉個(gè)例子:
復(fù)制代碼 代碼如下:
<script>
var sMessage = "Hello world";
function sayHello(){
alert(sMessage);
}
sayHello();
addNumber(1,2);
var iBaseNum = 10;
function addNumber(iNum1, iNum2) {
function doAddition() {
alert(iNum1 + iNum2 + iBaseNum);
}
return doAddition();
}
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
c();
</script>
第一個(gè)函數(shù)sayHello沒有傳參數(shù),直接利用了sMessage變量,這個(gè)就叫做閉包。
第二個(gè)函數(shù)復(fù)雜點(diǎn),里面有個(gè)doAddition也是閉包函數(shù),他不需要參數(shù),直接在執(zhí)行環(huán)境中獲取iNum1,iNum2,還有外部變量 iBaseNum。
第三個(gè)函數(shù) 是能保護(hù) i變量的訪問,并且一直保存i在內(nèi)存中,可以一直增加。(閉包的一個(gè)經(jīng)典用法)
jquery中閉包也差不多,先給個(gè)例子
你也許會(huì)問
復(fù)制代碼 代碼如下:
(function($){
$("div p").click(function(){alert("cssrain!")});
})(jQuery); //一個(gè)閉包
這是什么寫法?。?
別急,我也是請(qǐng)教了upc ,才稍微懂了點(diǎn)。
這里面的$只是形參,但jquery是全局變量,所以不需要調(diào)用該函數(shù)就會(huì)自動(dòng)執(zhí)行,或者分兩步
就是轉(zhuǎn)化成正常的函數(shù),先寫函數(shù),后調(diào)用。
如下所示
其實(shí):
復(fù)制代碼 代碼如下:
(function($){
$("div p").click(。。。);
})(jQuery);
就是等于
復(fù)制代碼 代碼如下:
function tempFunction($){ //創(chuàng)建一個(gè)以$為形參的函數(shù)
$("div p").click(....);
}
TempFunction(jQuery); //傳入實(shí)參jQuery執(zhí)行函數(shù).
干脆直接這么寫 ,算了
復(fù)制代碼 代碼如下:
(function(cssrain){
cssrain("div p").click(.... );
})(jQuery); //一個(gè)閉包
閉包的基本寫法:
(function(){do someting})();
//這個(gè)你就理解為定義一個(gè)匿名函數(shù)并立即執(zhí)行
帶參數(shù)的話就這樣:
(function(形參){do someting})(實(shí)參);
另外
(function(){var upc="i am upc"})();
alert(upc);
會(huì)提示undefined。
因?yàn)殚]包后,里面的變量就相當(dāng)于局部了。
閉包的好處:
不增加額外的全局變量,
執(zhí)行過程中所有變量都是在匿名函數(shù)內(nèi)部。
上面的例子不是很好,跟javascript的閉包有點(diǎn)混淆,但這確實(shí)也是jquery中的一種閉包。只不過經(jīng)過jquery的加工罷了。
如過有什么不對(duì),大家互相討論,我也是初學(xué)者,還有很多不懂得地方。
相關(guān)文章
微信小程序 簡(jiǎn)易計(jì)算器實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了微信小程序 簡(jiǎn)易計(jì)算器實(shí)現(xiàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09JavaScript實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的幾種常用方式
這篇文章主要介紹了JavaScript實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的幾種常用方式,結(jié)合實(shí)例形式對(duì)比分析了JavaScript頁(yè)面跳轉(zhuǎn)的常見實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11ES5 模擬 ES6 的 Symbol 實(shí)現(xiàn)私有成員功能示例
這篇文章主要介紹了ES5 模擬 ES6 的 Symbol 實(shí)現(xiàn)私有成員功能,結(jié)合實(shí)例形式分析了ES5 模擬 ES6 的 Symbol 實(shí)現(xiàn)私有成員功能相關(guān)原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05js onmousewheel事件多次觸發(fā)問題解決方法
做一個(gè)首屏和第二屏之間滾動(dòng)鼠標(biāo)滾輪就可以整平切換的效果,遇到了很多問題,下面是問題解決方法2014-10-10教你如何自定義百度分享插件以及bshare分享插件的分享按鈕
在項(xiàng)目中我們常用到百度分享插件或者bshare分享插件,雖然官方都有自定義按鈕的功能,但是畢竟還是只有少數(shù)幾種,我們?nèi)绾蝸碇谱饔凶约禾厣姆窒戆粹o呢?2014-06-06基于JavaScript實(shí)現(xiàn)瀑布流效果(循環(huán)漸近)
本文給大家介紹基于javascript實(shí)現(xiàn)循環(huán)漸近瀑布流效果,代碼簡(jiǎn)單易懂,非常具有參考價(jià)值,需要的朋友參考下吧2016-01-01推薦三款不錯(cuò)的圖片壓縮上傳插件(webuploader、localResizeIMG4、LUploader)
這篇文章主要為大家詳細(xì)介紹了三款不錯(cuò)的圖片壓縮上傳插件,webuploader、移動(dòng)端上傳插件localResizeIMG4以及LUploader)2017-04-04