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

首頁 > 語言 > JavaScript > 正文

JavaScript閉包原理與用法實例分析

2024-05-06 15:31:52
字體:
來源:轉載
供稿:網友

本文實例講述了JavaScript閉包原理與用法。分享給大家供大家參考,具體如下:

1、與閉包有關的兩個概念:

1) 變量的作用域

不帶有關鍵字var的變量會成為全局變量;

在函數中使用關鍵字var聲明的變量是局部變量。

局部變量只有在函數內部才能訪問到,在函數外面是訪問不到的。但在函數內部可以通過作用域鏈一直向上搜索直到全局對象,也就是說,函數內部可以訪問函數外部的變量。

2) 變量的生存周期

對于全局變量,其生存周期是永久的,除非主動銷毀這個全局變量;

而對于在函數內用關鍵字var聲明的局部變量,當退出函數時,這些局部變量會隨著函數調用結束而被銷毀。

var func = function() {  var i = 1;  alert(i); // 輸出:1};alert(i); // 報錯:i is not defind.

例外情況:閉包

var func = function() {  var i = 1;  return function() {    alert(i);    i++;  }};var f1 = func();f1(); // 輸出:1f1(); // 輸出:2var f2 = func();f2(); // 輸出:1f2(); // 輸出:2

2、從閉包的一個經典應用談起

<div>0</div><div>1</div><div>2</div><div>3</div><div>4</div><script>  var divs = document.getElementsByTagName("div");  for (var i = 0; i < divs.length; i++) {    divs[i].onclick = function() {      alert(i);    };  }</script>

問題:無論單擊哪個div,都會彈出5。

原因:onclick事件是異步觸發的,當事件被觸發時,for循環早已結束,此時變量i的值早已經是5。

解決:在閉包的幫助下,把每次循環的i值都封閉起來。當事件函數順著作用域鏈從內到外查找變量i時,會先找到被封閉在閉包環境的i,單擊div時,會分別輸出0,1,2,3,4。

<div>0</div><div>1</div><div>2</div><div>3</div><div>4</div><script>var divs = document.getElementsByTagName("div");for (var i = 0; i < divs.length; i++) {  divs[i].onclick = (function(num) {    return function() {      alert(num);    };  })(i);}</script>

類似實例:閉包直接賦給數組

function createFunctions() {  var result = new Array();  for (var i = 0; i < 10; i++){    result[i] = function(){      return i;    };  }  return result;}for (var i = 0; i < 10; i++)  alert(createFunctions()[i]());

結果:result的每個元素都返回10。

說明:閉包的作用域鏈有明顯的副作用——閉包總是獲得外部函數變量的最終值。上面代碼中,外部函數產生一個函數數組result并返回。函數數組中的每個元素都是一個函數,每個函數都返回 i變量。似乎每個函數應該返回每次循環的i值,即依次返回0到9,但事實是,每個函數的返回結果都是10。這是因為每個內部函數返回的是變量i,而不是i在某個時刻的特定值,而i的作用域是整個外部函數,當外部函數執行完成后,i的值是10。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 武胜县| 广宁县| 广东省| 察哈| 武安市| 建平县| 广平县| 会同县| 高青县| 乌恰县| 定结县| 托克逊县| 辽中县| 普定县| 永登县| 龙川县| 双桥区| 东山县| 启东市| 阿勒泰市| 大方县| 三江| 永州市| 绥阳县| 兴城市| 广安市| 甘孜| 凤城市| 西畴县| 文化| 四子王旗| 营山县| 牟定县| 安化县| 清丰县| 霍山县| 临夏县| 进贤县| 罗平县| 开阳县| 定州市|