国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

JavaScript使用閉包模仿塊級(jí)作用域操作示例

2019-11-19 12:14:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了JavaScript使用閉包模仿塊級(jí)作用域操作。分享給大家供大家參考,具體如下:

在閱讀這篇文章之前,建議先閱讀JavaScript的作用域鏈以及JavaScript閉包

正如閉包的定義一樣:“閉包指的是有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)”, 閉包最大的意義就在于閉包可以對(duì)另一個(gè)函數(shù)作用域的變量進(jìn)行訪問(wèn),由此,閉包可以延伸出一系列的用法。

模仿塊級(jí)作用域

JavaScript沒(méi)有塊級(jí)作用域的概念。這意味著在塊語(yǔ)句中定義的變量,實(shí)際上是包含在函數(shù)中而非語(yǔ)句中創(chuàng)建的。從作用域鏈的角度來(lái)理解是,所有在函數(shù)內(nèi)定義的變量(所有,也就是說(shuō)塊語(yǔ)句中定義的變量也包含在內(nèi))都會(huì)在這個(gè)函數(shù)執(zhí)行時(shí)所創(chuàng)建的函數(shù)的活動(dòng)對(duì)象中,因此從函數(shù)內(nèi)的所有變量定義開始,就可以在函數(shù)內(nèi)部隨處訪問(wèn)它,閉包也可以通過(guò)作用域鏈訪問(wèn)它。
例子:

function outputNumbers(count){  for(var i = 0; i < count; i++){    console.log(i); // 0, 1, ... count - 1  }  console.log(i); // count}

C++, JAVA等語(yǔ)言中,變量i只會(huì)在for循環(huán)的語(yǔ)句塊(block)中有定義,循環(huán)一旦結(jié)束,變量i就會(huì)被銷毀。可是在JavaScript中,變量i是定義在outputNumbers()的活動(dòng)對(duì)象中,因此從函數(shù)內(nèi)的所有變量定義開始,就可以在函數(shù)內(nèi)部隨處訪問(wèn)它,閉包也可以通過(guò)作用域鏈訪問(wèn)它。即使像下面這樣重新聲明同一個(gè)變量,也不會(huì)改變它的值。

function outputNumbers(count){  for(var i = 0; i < count; i++){    console.log(i); // 0, 1, ... count - 1  }  var i;     // redeclare i  console.log(i); // count}

JavaScript從來(lái)不管是否多次聲明了同一個(gè)變量;遇到這種情況,JavaScript只會(huì)對(duì)后續(xù)的聲明視而不見(不過(guò)會(huì)執(zhí)行后續(xù)聲明中的變量初始化),將其當(dāng)成一個(gè)賦值語(yǔ)句。

函數(shù)包裝器可以用來(lái)模仿塊作用域并避免這個(gè)問(wèn)題。

函數(shù)包裝器就是創(chuàng)建并立即調(diào)用一個(gè)函數(shù)。

(function(){  console.log("Hello World!");})();

這段代碼直接輸出”Hello World”, 這就是一個(gè)函數(shù)包裝器。

函數(shù)包裝器的作用:

1. 立即執(zhí)行函數(shù)中的代碼,又不會(huì)再內(nèi)存中留下對(duì)該函數(shù)的引用;

2. 函數(shù)內(nèi)部的所有變量都會(huì)被立即銷毀(除非將這些變量賦值給了包含作用域中的變量)。

當(dāng)在函數(shù)內(nèi)部使用函數(shù)包裝器的時(shí)候,此時(shí)函數(shù)包裝器就是一個(gè)閉包,有權(quán)訪問(wèn)外部環(huán)境中的所有變量。

function outputNumbers(count){  (function(){    //塊級(jí)作用域    for(var i = 0; i < count; i++){      console.log(i); // 0, 1, ... count - 1    }  })();  console.log(i); // error}

在函數(shù)包裝器中可以訪問(wèn)外部環(huán)境outputNumbers()的變量count,打印0, 1, … count - 1,但是在函數(shù)包裝器執(zhí)行完畢之后,再訪問(wèn)變量i就會(huì)拋出錯(cuò)誤,因?yàn)閕是在函數(shù)包裝器中定義的,outputNumbers()函數(shù)無(wú)法訪問(wèn)。

無(wú)論在什么地方,如果只需要一些臨時(shí)變量,就可以使用塊級(jí)作用域!

使用函數(shù)包裝器這種閉包可以減少閉包過(guò)多占用內(nèi)存的問(wèn)題。因?yàn)闆](méi)有指向匿名函數(shù)的引用, 所以只要函數(shù)包裝器執(zhí)行完畢,就可以立即銷毀其作用域鏈了。

函數(shù)包裝器這種技術(shù)經(jīng)常在全局作用域中被用在函數(shù)外部,從而限制想全局作用域中添加過(guò)多的變量和函數(shù)。一般來(lái)說(shuō),我們都應(yīng)該盡量少向全局作用域中添加變量和函數(shù)。過(guò)多的全局變量和函數(shù)很容易導(dǎo)致命名沖突。通過(guò)創(chuàng)建塊級(jí)作用域,每個(gè)開發(fā)人員既可以使用自己的變量,有不必?fù)?dān)心搞亂全局作用域。例如:

(function(){  var now = new Date();  if (now.getMonth() == 0 && now.getDate() == 1) {    console.log("Happy new year");  }})();

將這段代碼放在全局作用域中,可以用來(lái)確定哪天是一月一日。其中變量now現(xiàn)在是匿名函數(shù)中的局部變量,避免了在全局變量中創(chuàng)建。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 当阳市| 蕲春县| 双牌县| 任丘市| 遂平县| 郑州市| 南充市| 宜兰市| 叙永县| 上虞市| 洱源县| 靖州| 崇明县| 阿尔山市| 阳朔县| 沾益县| 沛县| 杭锦旗| 象山县| 原阳县| 陇川县| 陈巴尔虎旗| 老河口市| 大石桥市| 云浮市| 精河县| 阿鲁科尔沁旗| 泾源县| 太原市| 五大连池市| 民权县| 九龙县| 莱阳市| 雅江县| 东阿县| 鄂托克旗| 双牌县| 黄平县| 津市市| 曲麻莱县| 福安市|