gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

理解Javascript中的Closure(閉包)

理解Javascript中的Closure(閉包)

閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。

一、變量的作用域

要理解閉包,首先必須理解Javascript特殊的變量作用域。

變量的作用域無非就是兩種:全局變量和局部變量。

Javascript語言的特殊之處,就在于函數內部可以直接讀取全局變量。

var n=999;     function f1(){     alert(n);   }     f1(); // 999

另一方面,在函數外部自然無法讀取函數內的局部變量。

function f1(){     var n=999; }   alert(n); // error

這里有一個地方需要注意,函數內部聲明變量的時候,一定要使用var命令。如果不用的話,你實際上聲明了一個全局變量!

function f1(){     n=999;   }     f1();     alert(n); // 999

二、如何從外部讀取局部變量?

出于種種原因,我們有時候需要得到函數內的局部變量。但是,前面已經說過了,正常情況下,這是辦不到的,只有通過變通方法才能實現。

那就是在函數的內部,再定義一個函數。

function f1(){       var n=999;       function f2(){       alert(n); // 999     }     }

在上面的代碼中,函數f2就被包括在函數f1內部,這時f1內部的所有局部變量,對f2都是可見的。但是反過來就不行,f2內部的局部變量,對f1就是不可見的。這就是Javascript語言特有的"鏈式作用域"結構(chain scope),子對象會一級一級地向上尋找所有父對象的變量。所以,父對象的所有變量,對子對象都是可見的,反之則不成立。

既然f2可以讀取f1中的局部變量,那么只要把f2作為返回值,我們不就可以在f1外部讀取它的內部變量了嗎!

function f1(){       var n=999;       function f2(){       alert(n);      }       return f2;     }     var result=f1();     result(); // 999

三、閉包的概念

上一節代碼中的f2函數,就是閉包。

各種專業文獻上的"閉包"(closure)定義非常抽象,很難看懂。我的理解是,閉包就是能夠讀取其他函數內部變量的函數。

由于在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。

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

四、閉包的用途

閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。

怎么來理解這句話呢?請看下面的代碼。

function f1(){       var n=999;       nAdd=function(){n+=1}       function f2(){       alert(n);     }       return f2;     }     var result=f1();     result(); // 999     nAdd();     result(); // 1000

在這段代碼中,result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是999,第二次的值是1000。這證明了,函數f1中的局部變量n一直保存在內存中,并沒有在f1調用后被自動清除。

為什么會這樣呢?原因就在于f1是f2的父函數,而f2被賦給了一個全局變量,這導致f2始終在內存中,而f2的存在依賴于f1,因此f1也始終在內存中,不會在調用結束后,被垃圾回收機制(garbage collection)回收。

這段代碼中另一個值得注意的地方,就是"nAdd=function(){n+=1}"這一行,首先在nAdd前面沒有使用var關鍵字,因此nAdd是一個全局變量,而不是局部變量。其次,nAdd的值是一個匿名函數(anonymous function),而這個匿名函數本身也是一個閉包,所以nAdd相當于是一個setter,可以在函數外部對函數內部的局部變量進行操作。

五、使用閉包的注意點

1)由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。

2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。

六、思考題

如果你能理解下面兩段代碼的運行結果,應該就算理解閉包的運行機制了。

代碼片段一

var name = "The Window";     var object = {     name : "My Object",       getNameFunc : function(){       return function(){         return this.name;       };       }     };     alert(object.getNameFunc()());

代碼片段二

var name = "The Window";     var object = {     name : "My Object",       getNameFunc : function(){       var that = this;       return function(){         return that.name;       };       }     };     alert(object.getNameFunc()());

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
久热精品在线播放| 麻豆映画在线观看| 91传媒免费视频| 国产日韩成人内射视频| 日本大胆人体视频| 亚洲综合123| 在线观看国产福利| 久草在在线视频| www.亚洲天堂网| 精品少妇人妻av免费久久洗澡| 精产国品一二三区| 午夜啪啪小视频| 日本人69视频| 亚洲免费999| 天天摸天天舔天天操| 日本中文字幕二区| 少妇一级淫免费放| 热久久精品免费视频| 免费男同深夜夜行网站| www.色就是色| 无需播放器的av| 久久久久久久高清| 性久久久久久久久久久久久久| 在线黄色免费看| 国产奶头好大揉着好爽视频| 青青草原国产免费| 51xx午夜影福利| 青青青青草视频| 欧美日韩在线中文| 福利在线一区二区三区| 伊人成人222| 欧美亚洲视频一区| 丁香婷婷综合激情| 欧美极品欧美精品欧美图片| 国产一区二区在线免费播放| 五月花丁香婷婷| 国产夫妻自拍一区| 久久久免费视频网站| 国产又黄又猛又粗| 400部精品国偷自产在线观看 | 黄色免费高清视频| youjizz.com在线观看| 玩弄中年熟妇正在播放| 中国黄色片免费看| 久久人妻无码一区二区| 日本精品一区在线观看| 91丨九色丨蝌蚪| 日韩av高清在线看片| 午夜精品在线免费观看| 精品少妇人妻av一区二区| 亚洲熟妇av一区二区三区漫画| 爱情岛论坛成人| 一道本在线观看视频| 欧美老熟妇喷水| 欧洲美女亚洲激情| 国产最新免费视频| 黄色免费高清视频| 久久久国产欧美| 丁香六月激情婷婷| 天天操精品视频| 欧美日韩大尺度| www.欧美黄色| 911福利视频| 黄色动漫网站入口| 91免费国产精品| 天堂av2020| 999精品视频在线| 国产一区二区在线视频播放| 四虎1515hh.com| 乌克兰美女av| 丝袜老师办公室里做好紧好爽| 九九久久九九久久| 五月天婷婷亚洲| 熟妇人妻va精品中文字幕 | 全黄性性激高免费视频| 日日夜夜精品视频免费观看| 亚洲精品久久久中文字幕| 精品中文字幕av| 婷婷无套内射影院| 日韩xxxx视频| 精品视频在线观看一区| 波多野结衣与黑人| 日韩精品一区二区三区电影| 亚洲精品中文字幕乱码无线| 日本人69视频| 国产九九热视频| 三上悠亚av一区二区三区| 亚洲黄色小视频在线观看| 六月激情综合网| 国产视频一区二区视频| 精品少妇无遮挡毛片| 妞干网在线免费视频| 久草在在线视频| 国产aaaaa毛片| 国产一级片自拍| 91亚洲一区二区| 4444在线观看| 男女日批视频在线观看| 熟女少妇在线视频播放| 欧美污视频网站| 麻豆三级在线观看| 999久久久精品视频| 久久免费一级片| 成人性免费视频| 欧美精品色婷婷五月综合| 久久久精品三级| 麻豆中文字幕在线观看| 国产情侣第一页| 欧美日韩第二页| 亚洲精品性视频| 精品无码国产一区二区三区av| 激情伊人五月天| 97超碰人人爽| 成人免费a级片| 国产精品久久久久9999小说| 亚洲av毛片在线观看| www.日本在线视频| 天天插天天操天天射| 美国av在线播放| 美女福利视频在线| 两性午夜免费视频| 日韩欧美一区三区| 久久久福利影院| 成人在线免费在线观看| 三级黄色片播放| 国产乱子夫妻xx黑人xyx真爽| 免费看污污网站| 妺妺窝人体色777777| 欧美精品 - 色网| 男人天堂1024| 国产精品夜夜夜爽张柏芝| 欧美极品欧美精品欧美图片| 二级片在线观看| 麻豆一区二区三区视频| 国产真人做爰毛片视频直播| 久久6免费视频| 免费日韩视频在线观看| 久久手机在线视频| 老司机久久精品| 免费在线观看日韩视频| 青青在线免费观看| 国内av免费观看| 在线黄色免费看| 欧美视频免费播放| 300部国产真实乱| 91免费视频污| 毛片毛片毛片毛| 久久久国产欧美| 99福利在线观看| 精品国产一二三四区| av电影一区二区三区| 91插插插插插插插插| 熟妇人妻va精品中文字幕| 777777av| www黄色日本| 日韩欧美亚洲天堂| 亚洲熟妇国产熟妇肥婆| 国内精品视频一区二区三区| www.av91| 3d动漫一区二区三区| 成人性免费视频| 欧美视频在线播放一区| 18禁免费无码无遮挡不卡网站| 日韩av在线播放不卡| 99在线精品免费视频| 人妻少妇精品无码专区二区| 欧美精品卡一卡二| 乱人伦xxxx国语对白| 欧美牲交a欧美牲交| 欧美精品一区二区三区免费播放| 黄色国产精品视频| 久久99999| 熟妇熟女乱妇乱女网站| 一本色道久久88亚洲精品综合| 警花观音坐莲激情销魂小说| 国产精品三级一区二区| 国产在线播放观看| 久久久久人妻精品一区三寸| 91香蕉视频污版| 国产又大又长又粗又黄| 精品免费久久久久久久| 欧美 日韩 亚洲 一区| 成熟老妇女视频| 无限资源日本好片| 麻豆传媒网站在线观看| 日韩欧美视频网站| 超碰在线人人爱| 中文字幕在线中文| www.亚洲天堂网| 日韩精品在线播放视频| 欧美亚洲日本一区二区三区| 亚洲男人天堂色| 激情六月天婷婷| 激情婷婷综合网| 成人在线观看毛片| 熟女少妇精品一区二区| 99热这里只有精品免费| 熟妇人妻va精品中文字幕| 偷拍盗摄高潮叫床对白清晰| 精品人妻一区二区三区四区在线|