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

首頁 > 編程 > JavaScript > 正文

淺談JavaScript中的作用域和閉包問題

2019-11-20 12:05:50
字體:
來源:轉載
供稿:網(wǎng)友

JavaScript的作用域以函數(shù)為界,不同的函數(shù)擁有相對獨立的作用域。函數(shù)內部可以聲明和訪問全局變量,也可以聲明局部變量(使用var關鍵字,函數(shù)的參數(shù)也是局部變量),但函數(shù)外部無法訪問內部的局部變量:

function test() {var a = 0; // 局部變量b = 1; // 全局變量}a = ?, b = ? // a為undefined,b為1

同名的局部變量會覆蓋全局變量,但本質上它們是兩個獨立的變量,一方發(fā)生變化不會影響另一方:

a = 5; // 函數(shù)外a的值為5function test() {var a = 4; // 函數(shù)內a的值為4}();a = ? // 函數(shù)外a的值仍為5,不受函數(shù)影響

一般而言,函數(shù)結束后,對函數(shù)內部變量的引用全部結束,函數(shù)內的局部變量將被回收,函數(shù)的執(zhí)行環(huán)境將被清空,但是,如果以內部函數(shù)作為函數(shù)的返回結果,情況就會發(fā)生變化:

function test(i) {var b = i * i;return function() {return b--;};}var a = test(8);a(); // 返回值為64, 內部變量b為63a(); // 返回值為63, 內部變量b為62

當以內部函數(shù)作為返回值時,因為函數(shù)結束后內部變量的引用并未結束,所以函數(shù)的局部變量無法回收,函數(shù)的執(zhí)行環(huán)境被保留下來,因而形成了閉包效果,可以通過該引用訪問本該被回收的內部變量。
閉包還使得函數(shù)的局部變量成為“私有”變量,只能通過返回的內部函數(shù)訪問,而無法通過其他任何手段去改變。
因此,閉包可用于維持局部變量和保護變量。
不使用閉包的情況:

var a = []; // 假設a中包含5個元素for (var i = 0, m = a.length; i < m; i++) {a[i].onclick = function(e) {return 'No. ' + i;};}// 點擊任何一個元素,返回值都是“No. 5”,因為i最后的值為5使用閉包的情況:function test(i) {return function(e) {return 'No. ' + i;};}var a = []; // 假設a中包含5個元素for (var i = 0, m = a.length; i < m; i++) {a[i].onclick = test(i);}// 使用閉包維持局部變量,點擊元素返回No. 0 ~ No. 4

閉包帶來便利的同時,也會帶來一些弊端:
1、程序復雜度增加,理解更加困難
2、干擾正常的垃圾回收,復雜的閉包還可能導致內存無法回收而崩潰
3、龐大的閉包往往伴隨著性能問題
因此,閉包宜精簡小巧,而不宜龐大復雜,同時應避免大規(guī)模的使用閉包。閉包的出現(xiàn),本身是語言的一個bug,但是因為它獨特的功能而保留下來。它是一個輔助手段,而不是主要功能。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 康定县| 安塞县| 五原县| 鹤峰县| 桂平市| 蒙阴县| 荔波县| 林西县| 莒南县| 汤阴县| 双城市| 灌云县| 治县。| 文水县| 龙海市| 台山市| 泗洪县| 辽宁省| 钟祥市| 永修县| 论坛| 且末县| 荆门市| 璧山县| 安平县| 梁山县| 东兰县| 玛曲县| 隆德县| 苗栗县| 本溪市| 洪洞县| 镇原县| 十堰市| 宜丰县| 温泉县| 定结县| 长治市| 玉田县| 正宁县| 钦州市|