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

首頁 > 語言 > JavaScript > 正文

js中let能否完全替代IIFE

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

前言

最近,我寫了一篇關于syntax of Java's IIFE pattern的文章,來解釋為什么我們用現在的方式來寫立即執行函數表達式。少數的讀者批評文章過時了,都在爭論在ECMA 2015中介紹的塊級作用域變量使IIFE變得過時了。

恰恰相反,立即執行函數表達式一點也沒有過時!因為這個理由,我決定寫這篇后續文章來介紹一些立即執行函數表達式的常見用法。注意以下的列表是不完整的,所以如果你喜歡的用法沒有在文章出現,希望你不要有什么不好的感覺。

函數作用域 VS 塊級作用域

通過var關鍵字聲明的本地變量僅作用于當前閉包域,如果不存在這樣的一個閉包函數,那么將會創建一個污染全局作用域的全局變量。為了防止這種情況出現,我們可以使用IIFE來創建一個包含有這個本地變量的函數。

(function(){varfoo= "bar";console.log(foo);})();foo;// ReferenceError: foo is not defined

目前的爭論是,我們可以使用在ECMA 2015介紹的塊級作用域變量來代替IIFE,以達到相同的效果。相比于函數級作用域,let和const關鍵字聲明的本地變量僅作用于當前所處的”塊”級域。

{let foo= "bar";console.log(foo);}foo;// ReferenceError: foo is not defined

然而,塊級作用域變量不是立即函數執行表達式的替代品。確實,如果支持ECMA 2015,let和const能夠用來限制本地變量只在包含它的塊級作用域內使用。

如果,你在不支持ECMA 2015的環境(例如一些舊的瀏覽器)中執行你的Java代碼。你就不能使用let和const關鍵字來創建塊級作用域變量。你將不得不求助于以前經典的函數級作用域方法。

閉包和私有數據

IIFE的另一個用法是為局部變量提供一個封裝的作用域,在IIFE返回的函數中能夠訪問該變量。這種方式即_a closure is created_允許函數訪問這個本地變量,即使這個函數在IIFE的詞法范圍之外執行時。

假設我們要創建一個uniqueId函數,每次調用該函數時就會返回一個唯一的id(比如 “id_1”,“id_2”等)。在下面的IIFE中,記錄了一個私有的計數變量(count),每次調用計數函數uniqueId的時候,就會將count加一。我們在IIFE中返回的另一個函數,這個函數在調用時會返回一個新的標識符字符串。

constuniqueId= (function(){let count= 0;returnfunction(){++count;returnid_${count};};})();console.log(uniqueId());// "id_1"console.log(uniqueId());// "id_2"console.log(uniqueId());// "id_3"

注意,在IIEF之外無法訪問這個計數變量count。除了從IIEF中返回的函數,別人無法讀寫該變量。這樣就能創建真正的私有狀態,它只能以受控的方式進行修改。revealing module pattern非常依賴于這種機制。

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

圖片精選

主站蜘蛛池模板: 小金县| 长岭县| 龙州县| 汝阳县| 绥江县| 康保县| 黔西| 贵阳市| 邳州市| 五莲县| 新巴尔虎左旗| 德格县| 中阳县| 新邵县| 时尚| 冀州市| 呼和浩特市| 揭西县| 武胜县| 富裕县| 依安县| 堆龙德庆县| 上思县| 谢通门县| 嵩明县| 腾冲县| 平利县| 新安县| 平顶山市| 任丘市| 白城市| 汪清县| 瓦房店市| 曲阜市| 霍林郭勒市| 任丘市| 天门市| 贵南县| 石狮市| 洛扎县| 新绛县|