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

首頁 > 語言 > JavaScript > 正文

JavaScript中閉包的詳解

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

閉包是什么

在 JavaScript 中,閉包是一個讓人很難弄懂的概念。ECMAScript 中給閉包的定義是:閉包,指的是詞法表示包括不被計算的變量的函數,也就是說,函數可以使用函數之外定義的變量。

是不是看完這個定義感覺更加懵逼了?別急,我們來分析一下。

閉包是一個函數 閉包可以使用在它外面定義的變量 閉包存在定義該變量的作用域中

好像有點清晰了,但是使用在它外面定義的變量是什么意思,我們先來看看變量作用域。

變量作用域

變量可分為全局變量和局部變量。全局變量的作用域就是全局性的,在 js 的任何地方都可以使用全局變量。在函數中使用 var 關鍵字聲明變量,這時的變量即是局部變量,它的作用域只在聲明該變量的函數內,在函數外面是訪問不到該變量的。

var func = function(){  var a = 'linxin';  console.log(a);     // linxin}func();console.log(a);       // Uncaught ReferenceError: a is not defined

作用域相對比較簡單,我們不多講,來看看跟閉包關系比較大的變量生存周期。

變量生存周期

全局變量,生命周期是永久的。局部變量,當定義該變量的函數調用結束時,該變量就會被垃圾回收機制回收而銷毀。再次調用該函數時又會重新定義了一個新變量。

var func = function(){  var a = 'linxin';  console.log(a);}func();

a 為局部變量,在 func 調用完之后,a 就會被銷毀了。

var func = function(){  var a = 'linxin';  var func1 = function(){    a += ' a';    console.log(a);  }  return func1;}var func2 = func();func2();          // linxin afunc2();          // linxin a afunc2();          // linxin a a a

可以看出,在第一次調用完 func2 之后,func 中的變量 a 變成 'linxin a',而沒有被銷毀。因為此時 func1 形成了一個閉包,導致了 a 的生命周期延續了。

這下子閉包就比較明朗了。

閉包是一個函數,比如上面的 func1 函數 閉包使用其他函數定義的變量,使其不被銷毀。比如上面 func1 調用了變量 a 閉包存在定義該變量的作用域中,變量 a 存在 func 的作用域中,那么 func1 也必然存在這個作用域中。

現在可以說,滿足這三個條件的就是閉包了。

下面我們通過一個簡單而又經典的例子來進一步熟悉閉包。

for (var i = 0; i < 4; i++) {  setTimeout(function () {    console.log(i)  }, 0)}

我們可能會簡單的以為控制臺會打印出 0 1 2 3,可事實卻打印出了 4 4 4 4,這又是為什么呢?我們發現,setTimeout 函數時異步的,等到函數執行時,for循環已經結束了,此時的 i 的值為 4,所以 function() { console.log(i) } 去找變量 i,只能拿到 4。

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

圖片精選

主站蜘蛛池模板: 兴义市| 苏尼特右旗| 台东县| 嘉善县| 汉阴县| 琼海市| 宜昌市| 河东区| 栖霞市| 开封县| 正蓝旗| 方正县| 津市市| 宜丰县| 金平| 六盘水市| 南昌市| 漳州市| 陵川县| 简阳市| 尤溪县| 贡觉县| 宁国市| 连南| 顺昌县| 乃东县| 藁城市| 额济纳旗| 武宁县| 紫金县| 凭祥市| 洪江市| 台前县| 兰西县| 保德县| 浦北县| 景谷| 凤台县| 凤冈县| 阳高县| 宁南县|