日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

讲讲JavaScript的闭包

發(fā)布時(shí)間:2025/1/21 javascript 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 讲讲JavaScript的闭包 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡介

函數(shù)和對(duì)其周圍狀態(tài)(lexical environment,詞法環(huán)境)的引用捆綁在一起構(gòu)成閉包closure)。也就是說,閉包可以讓你從內(nèi)部函數(shù)訪問外部函數(shù)作用域。在 JavaScript 中,每當(dāng)函數(shù)被創(chuàng)建,就會(huì)在函數(shù)生成時(shí)生成閉包。

簡單的來講,閉包就是一個(gè)函數(shù)里面嵌套一個(gè)函數(shù)。

function a (){var text = "func";function b(){console.log(text); };b(); } a(); // 輸出 func

可見,嵌套函數(shù)可訪問聲明于它們外部作用域的變量。這也是閉包的作用之一。

實(shí)例

function makeFunc() {var name = "tom";function displayName() {alert(name);}return displayName; }var myFunc = makeFunc(); myFunc();

第一眼看上去,也許不能直觀地看出這段代碼能夠正常運(yùn)行。在一些編程語言中,一個(gè)函數(shù)中的局部變量僅存在于此函數(shù)的執(zhí)行期間。一旦 makeFunc() 執(zhí)行完畢,你可能會(huì)認(rèn)為 name 變量將不能再被訪問。然而,因?yàn)榇a仍按預(yù)期運(yùn)行,所以在 JavaScript 中情況顯然與此不同。

原因在于,JavaScript中的函數(shù)會(huì)形成了閉包。 閉包是由函數(shù)以及聲明該函數(shù)的詞法環(huán)境組合而成的。該環(huán)境包含了這個(gè)閉包創(chuàng)建時(shí)作用域內(nèi)的任何局部變量。在本例子中,myFunc 是執(zhí)行 makeFunc 時(shí)創(chuàng)建的 displayName 函數(shù)實(shí)例的引用。displayName 的實(shí)例維持了一個(gè)對(duì)它的詞法環(huán)境(變量 name 存在于其中)的引用。因此,當(dāng) myFunc 被調(diào)用時(shí),變量 name 仍然可用,其值 tom就被傳遞到alert中。

用閉包模擬私有方法

在許多編程語言中是支持私有方法的,比如Java。

我們?cè)贘S里面可以用閉包模擬私有方法。

其實(shí)在日常JavaScript的使用中,我們天天在用閉包的私有方法。

比如說:

var num = Number.parseInt(3.14) console.log(num); // 3

其中的Number.parseInt()

就是用的閉包模擬的私有方法。

使用私有方法的好處

  • 私有方法不僅僅有利于限制對(duì)代碼的訪問
  • 還提供了管理全局命名空間的強(qiáng)大能力
  • 避免非核心的方法弄亂了代碼的公共接口部分。

實(shí)例

var makeCounter = function() {var privateCounter = 0;// 函數(shù)功能: 改變privateCounter的值function changeBy(val) {privateCounter += val;}return {increment: function() {changeBy(1);},decrement: function() {changeBy(-1);},value: function() {return privateCounter;}} };var Counter1 = makeCounter(); var Counter2 = makeCounter(); console.log(Counter1.value()); /* logs 0 */ Counter1.increment(); Counter1.increment(); console.log(Counter1.value()); /* logs 2 */ Counter1.decrement(); console.log(Counter1.value()); /* logs 1 */ console.log(Counter2.value()); /* logs 0 */

請(qǐng)注意兩個(gè)計(jì)數(shù)器 Counter1 和 Counter2 是如何維護(hù)它們各自的獨(dú)立性的。每個(gè)閉包都是引用自己詞法作用域內(nèi)的變量 privateCounter 。

每次調(diào)用其中一個(gè)計(jì)數(shù)器時(shí),通過改變這個(gè)變量的值,會(huì)改變這個(gè)閉包的詞法環(huán)境。然而在一個(gè)閉包內(nèi)對(duì)變量的修改,不會(huì)影響到另外一個(gè)閉包中的變量。

總結(jié)

以上是生活随笔為你收集整理的讲讲JavaScript的闭包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。