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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript 中的暗物质 - 闭包

發布時間:2023/12/9 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript 中的暗物质 - 闭包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 詭異的閉包

javascript 中有一個特殊的特性 - 閉包,對于 .NET 程序員來說,比較熟悉的是面向對象的程序設計 OOP,? 而來自函數式語言的閉包則顯得比較詭異,許多程序員對它敬而遠之。

對于閉包我們還是要從函數式語言的特點說起。

不知道你有沒有發現,在 javascript 中沒有 public ,private 之類的關鍵字,也沒有 class ,雖然也存在對象一說,但是對象的地位遠遠沒有在 C# 中是一等公民,在 js 中,沒有對象你也可以一樣寫程序。它只是一種數據的表示形式而已,可有也可無。

2. 閉包何來?

如何在 javascript 實現數據的保護呢?閉包就是實現它的利器,這需要我們放下普通的對象,理解一下 javascript 的工作原理。

在 javascript 中,可以在函數中定義新的函數,這種嵌套函數還可以作為函數的返回值,被外部的變量所引用。在普通的程序設計語言中,比如 C 中,雖然也存在函數指針的概念,但是,所謂的函數指針僅僅是一段代碼的地址而已,而 javascript 中返回的函數引用,則不限于此。

在 C 語言中,在函數運行的時候,局部變量是保存在堆棧中的,函數執行完畢,系統所做的是彈出堆棧。

實際上,在 javascript 中,函數每次執行的時候,注意是運行時,系統會同時創建一個此次函數運行的環境對象,而此次運行期間的局部變量則關聯在這個環境對象上,在普通不返回函數的普通函數中,函數執行完畢,則環境對象也一起釋放。而如果函數返回了定義在外部函數中的嵌套函數,那么,這個環境對象將不會釋放,也就是說,這個時候,返回了一個看得見的函數對象,還附帶了一個看不見的暗物質 - 外部函數的環境對象。

看得見的函數對象加上隱含的環境對象就是閉包。

這個環境對象只能通過這個函數隱式訪問,我們并沒有它的引用,也無法直接訪問它。結果就是實現了信息的隱藏。

3. 實現私有的數據

考慮下面的代碼

function outer() {var name = "Alice";var inner = function () {return name;}return inner; }var fn = outer(); alert(fn());

在這個例子中,看起來簡單的 fn 函數背后,其實暗藏了在執行 outer 函數時期創建的環境對象,所以通過 fn 可以得到 Alice 這個名字,而且沒有其他的渠道允許得到這個名字。

4. 為什么數據搞亂了?

再看另外一個經典的例子。

<body><div><a href="#">Click Me!</a><a href="#">Click Me!</a><a href="#">Click Me!</a></div><script type ="text/javascript">function main(links) {for (var i = 0; i < links.length; i++) {links[i].onclick = function () {alert(i + 1);}}};main(document.getElementsByTagName("a"));</script></body>

彈出的是多少呢?感覺有三次循環,應該彈出 1, 2, 3。運行一下,你會看到實際上是 4, 4, 4!

是不是非常詭異?

從閉包的角度來說,則非常簡單,main 函數執行了幾次呢?只有一次,在執行的時候創建了一個閉包對象,其中引用了定義在 main 中的局部變量 i,在循環體中,實際上創建了三個內部函數,它們引用的都是同一個環境對象。這些函數注冊到鏈接的 onclick 事件上,其實也就是已經傳出了函數 main,所以,main 的環境對象也就悄悄地成為了暗物質,而循環完成之后 i 已經最終被賦予了 3 這個值,三個函數訪問的是同一個環境對象中的 i, 所以,在點擊鏈接的時候看到 4 這個結果也就正常了。

5. 解鈴還需系鈴人

如果希望得到的是? 1, 2, 3 這個結果又該怎么辦呢?

我們可以定義一個內部函數,讓它執行三次,這個將會創建三個對應的環境對象,我們可以使得這三個環境對象包含不同的值。

function main(links) {var inner = function (elem, i) {elem.onclick = function () {alert(i + 1);};};for (var i = 0; i < links.length; i++) {var elem = links[i];inner(elem, i);} };

由于 inner 函數執行了三次,所以將會創建三個不同的環境對象,每個環境對象中的? i 都是不同的值。這樣注冊到 onclick 中的函數就可以訪問到不同的值了。

閉包的概念

這里,我們可以看一下閉包的概念了。來自 Wiki 的說明是這樣的

在計算機科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。

轉載于:https://www.cnblogs.com/haogj/archive/2012/11/28/2793535.html

總結

以上是生活随笔為你收集整理的javascript 中的暗物质 - 闭包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩av女优在线观看 | 天堂…中文在线最新版在线 | 国产午夜毛片 | 精品在线观看一区 | 午夜视频导航 | 久久日av| 黄色大片免费网站 | 日本免费成人 | 一区二区日韩精品 | 中文字幕精品一区二区精品 | 午夜免费剧场 | 欧美成人精品欧美一级私黄 | 在线视频啪 | 国产精品自拍小视频 | 国产日韩欧美激情 | 性xxxx视频播放免费 | 日韩欧美视频在线免费观看 | 亚洲成人午夜电影 | 四虎在线视频免费观看 | 欧美日韩中文字幕视频 | 99国产在线视频 | 亚洲欧洲av在线 | 婷婷中文字幕 | 国产精品久久久久久白浆 | 国产xxxxx | 国产日韩欧美精品在线 | 玉势 (1v1 高h)| 午夜免费福利在线 | 姑娘第5集在线观看免费 | 久久久久久人妻一区二区三区 | 老头糟蹋新婚少妇系列小说 | 好男人www社区 | 黄三级 | 亚洲字幕av一区二区三区四区 | 国产精品久久久久久久久夜色 | 欧美熟妇乱码在线一区 | 高潮毛片无遮挡 | 欧美精品一区三区 | 日韩123区| 久久久亚洲一区二区三区 | 欧美一区二区二区 | 狂野欧美性猛交xxⅹ李丽珍 | 91在线综合 | 久久这里有精品 | 亚洲日本国产精品 | 91视频在线免费观看 | 精品不卡视频 | 秋霞视频一区二区 | 亚洲综合精品一区 | 成人小说亚洲一区二区三区 | 国产麻豆乱码精品一区二区三区 | 影音av资源 | 天天插天天插 | 美女黄色小视频 | 97影院 | 久久人人澡 | 国产麻豆剧传媒精品国产 | 亚洲精品国产91 | 在线免费福利 | 亚洲一级Av无码毛片久久精品 | 三级第一页 | 毛片视频网站在线观看 | 男女免费看| 快播怡红院 | 97色婷婷| 色综合狠狠 | 国产成人一区二区在线 | 三级黄色短视频 | 公肉吊粗大爽色翁浪妇视频 | 五月婷婷六月香 | 爱爱免费视频网站 | 强辱丰满人妻hd中文字幕 | 777在线视频| 日韩欧美在线观看一区二区三区 | 欧美专区 日韩专区 | 在线观看黄网站 | 黄网址在线观看 | 性视频免费 | www一区二区 | 免费观看美女裸体网站 | 激情都市一区二区 | 香蕉久久久久久久av网站 | 2021国产在线视频 | 黄色性情网站 | 91日韩在线视频 | 欧美在线看片 | 中文字幕精 | 恶虐女帝安卓汉化版最新版本 | 免费吸乳羞羞网站视频 | 91成人在线 | 国产精品无码内射 | 欧美一区二区三区久久 | 后进极品白嫩翘臀在线视频 | 精品国内自产拍在线观看视频 | 椎名由奈在线观看 | 国产精品色图 | 熟女毛毛多熟妇人妻aⅴ在线毛片 | 我的公把我弄高潮了视频 | 亚洲av成人一区二区 |