精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入理解立即執(zhí)行函數(shù)

開發(fā) 前端
立即執(zhí)行函數(shù)常用于第三方庫,它可以用來隔離變量作用域,很多第三方庫都會存在大量的變量和函數(shù),在ES5環(huán)境下為了避免變量污染,開發(fā)者想到的解決辦法就是使用立即執(zhí)行函數(shù)。

[[394531]]

本文轉(zhuǎn)載自微信公眾號「神奇的程序員k」,作者神奇的程序員k。轉(zhuǎn)載本文請聯(lián)系神奇的程序員k公眾號。神奇的程序員K  

 前言

立即執(zhí)行函數(shù)常用于第三方庫,它可以用來隔離變量作用域,很多第三方庫都會存在大量的變量和函數(shù),在ES5環(huán)境下為了避免變量污染,開發(fā)者想到的解決辦法就是使用立即執(zhí)行函數(shù)。

本文就跟大家分享下立即執(zhí)行函數(shù)的相關(guān)知識點,歡迎各位感興趣的開發(fā)者閱讀本文。

概念介紹

立即調(diào)用的匿名函數(shù)又被稱作立即調(diào)用的函數(shù)表達式(IIFE),它類似于函數(shù)聲明,但由于被包含在括號中,所以會被解釋為函數(shù)表達式。緊跟在第一組括號后面的第二組括號會立即調(diào)用前面的函數(shù)表達式,位于IIFE中的代碼在其外部是無法訪問的。

我們舉個例子來說明下:

  1. (function() { 
  2.   // 塊級作用域 
  3.   for (var i = 0; i < 5; i++) { 
  4.     console.log(i); 
  5.   } 
  6. })(); 
  7. console.log(i); 

上述代碼中當解析到console.log(i);時,會報錯ReferenceError: i is not defined,這是因為它訪問的變量是在IIFE內(nèi)部定義的,在外部訪問不到。

在es5以前,為了防止變量定義外泄,IIFE是個非常有效的方式,這樣也不會導(dǎo)致閉包相關(guān)的內(nèi)存問題,因為不存在對這個匿名函數(shù)的引用。因此,只要函數(shù)執(zhí)行完畢,其作用域鏈就可以被銷毀。

IIFE的全稱為Immediately Invoked Function Expression,翻譯過來就是立即調(diào)用函數(shù)表達式。

模擬塊級作用域

使用IIFE可以模擬塊級作用域,即在一個函數(shù)表達式內(nèi)部聲明變量,然后立即調(diào)用這個函數(shù),這樣位于函數(shù)體作用域的變量就像是在塊級作用域中一樣(如上述例子所示)。

在ES6以后,新增了塊級作用域的概念,因此我們想實現(xiàn)同樣的效果,就無需再使用IIFE了,我們用let來重寫下上面的例子,代碼如下所示:

  1. for (let i = 0; i < 5; i++) { 
  2.   console.log(i); 
  3. console.log(i); 

有關(guān)變量作用域的更多知識點請移步我的另一篇文章:深入理解作用域和閉包

塊級作用域無法替代立即調(diào)用函數(shù)的表達式,當你的代碼在不支持ES6+的瀏覽器上運行時,你不得不求助立即執(zhí)行函數(shù)來模擬。

實現(xiàn)私有變量

IIFE可以返回一個函數(shù)引用,當這個函數(shù)在IIFE的詞法范圍外執(zhí)行,也會創(chuàng)建一個閉包,使函數(shù)能夠訪問局部變量。

我們舉個例子來說明下,如下所示:

  1. const getOrderId = (function() { 
  2.   let count = 0; 
  3.   return function() { 
  4.     ++count
  5.     return `id_${count}`; 
  6.   }; 
  7. })(); 
  8. console.log(getOrderId()); 
  9. console.log(getOrderId()); 
  10. console.log(getOrderId()); 
  11. console.log(getOrderId()); 

上述代碼中:

  • 創(chuàng)建了一個自執(zhí)行函數(shù),其返回一個函數(shù)引用
  • 自執(zhí)行函數(shù)內(nèi)部有一個變量count,它就是一個私有變量,外部無法訪問
  • 最后,返回一個函數(shù)引用,形成閉包結(jié)構(gòu),對count自增后與_id進行拼接并返回

在IIFE之外無法訪問函數(shù)內(nèi)部的count變量,除了從IIFE中返回的函數(shù),別處無法讀寫該變量,這樣就能創(chuàng)建真正的私有狀態(tài)變量。

變量重命名

在平常開發(fā)中可能遇到兩個不同的庫,他們暴露的全局變量名卻是相同的,例如:正在使用Jquery,另一個庫也指定了一個名為$的全局變量。

為了解決命名沖突問題,可以將一段代碼封裝在一個IIFE中,將一個全局變量(比如Jquery)作為參數(shù)傳入IIFE,在函數(shù)內(nèi)部,就可以以一個任意的參數(shù)名(比如 $)來訪問該參數(shù)值,我們舉個例子來說明下,如下所示:

  1. window.$ = function somethingElse() { 
  2.  
  3.     // 其他代碼 
  4.  
  5. }; 
  6.  
  7.   
  8.  
  9. (function($) { 
  10.  
  11.     // 其他代碼 
  12.  
  13. })(jQuery); 

不管在全局作用域有什么值指定給,在IIFE中,這些值都會被屏蔽,`參數(shù)一直指向Jquery方法。

捕獲全局對象

JavaScript代碼在不同環(huán)境執(zhí)行時,所使用的全局對象是不同的,當代碼在瀏覽器環(huán)境運行時,全局對象是window,但是在node環(huán)境下,全局對象則是global。

在寫通用js代碼時,就可以利用IIFE將其包裝起來,例如:

  1. (function(global) { 
  2.  
  3.     // 其他代碼 
  4.  
  5. })(this); 

包裝之后,在IIFE內(nèi)部使用global時在瀏覽器環(huán)境下其值就是window,node環(huán)境下其值就是global。

IIFE的兩種寫法

立即執(zhí)行函數(shù)有兩種寫法:

  • (function(){})() 匿名函數(shù)包裹在一個括號運算符中,后面再跟一個小括號
  • (function(){}()) 匿名函數(shù)后面跟一個小括號,然后整個包裹在一個括號運算符中

上述兩種寫法是等價的,要想立即執(zhí)行函數(shù)做到立即執(zhí)行,要注意兩點:

  • 函數(shù)體后面要有小括號
  • 函數(shù)體必須是函數(shù)表達式而不能是函數(shù)聲明

函數(shù)的聲明方式

在講它們兩者之間的區(qū)別之前,我們先來了解下js函數(shù)的兩種聲明方式:表達式和聲明式。

函數(shù)的聲明式寫法為:function test(){},這種寫法會導(dǎo)致函數(shù)提升,所有通過function關(guān)鍵字聲明的變量都會被解釋器優(yōu)先編譯,不管聲明在什么位置都可以調(diào)用它,但是它本身并不會被執(zhí)行。

  1. test(); // 測試 
  2. function test() { 
  3.   console.log("測試"); 
  4. test(); // 測試 

函數(shù)的表達式寫法為:var test = function(){},這種寫法不會導(dǎo)致函數(shù)提升,必須先聲明后調(diào)用,不然就會報錯。

  1. test(); // 報錯:TypeError: test is not a function 
  2. var test = function() { 
  3.   console.log("測試"); 
  4. }; 

二者的區(qū)別

現(xiàn)在,我們回到正題,函數(shù)表達式加上()可以被直接調(diào)用,但是把整個聲明式函數(shù)用()包起來的話,則會被編譯器認為是函數(shù)表達式,從而可以用()來直接調(diào)用,如(function test(){})()。

如果將括號加在聲明式函數(shù)后面如function test(){},運行之后會報錯,因為不符合js的語法,想讓其通過瀏覽器的語法檢查,就必須添加符號,比如:()、+、!等,如下所示:

  1. function test(){ 
  2.   console.log("測試"); 
  3. }(); // 報錯 SyntaxError: Unexpected token ')' 
  4.  
  5. +function test() { 
  6.   console.log("測試"); 
  7. }(); // 正常執(zhí)行 
  8.  
  9. -function test() { 
  10.   console.log("測試"); 
  11. }(); // 正常執(zhí)行 
  12.  
  13. !function test() { 
  14.   console.log("測試"); 
  15. }();  // 正常執(zhí)行 
  16.  
  17. ~function test() { 
  18.   console.log("測試"); 
  19. }();  // 正常執(zhí)行 
  20.  
  21. void function test() { 
  22.   console.log("測試"); 
  23. }();  // 正常執(zhí)行 
  24.  
  25. new function test() { 
  26.   console.log("測試"); 
  27. }();  // 正常執(zhí)行 

立即執(zhí)行函數(shù)一般也寫成匿名函數(shù),使用function關(guān)鍵字聲明一個函數(shù),但未給函數(shù)命名,通過這種方式聲明的函數(shù)就是匿名函數(shù),例如function(){}。

匿名函數(shù)不能單獨使用,否則會js語法報錯,需要用()包起來,當我們需要給匿名函數(shù)傳值時,寫在其后面的括號即可,例如:

  1. (function(val) { 
  2.   console.log(val); 
  3. }("我是匿名函數(shù)的參數(shù)")); 

講解到此處時,我們會發(fā)現(xiàn),上述代碼的寫法正好是立即執(zhí)行函數(shù)的第二種寫法??,我們知道函數(shù)體后面跟著小括號,這個函數(shù)就會立即執(zhí)行。

我們知道自執(zhí)行函數(shù)是需要用()將其包裹起來的,前面我們講到用()包裹起來的代碼,編譯器會認定它為函數(shù)表達式,因此可以在其后面加個()立即調(diào)用這個函數(shù)。同時也可以從這個括號來為匿名函數(shù)傳參,代碼如下所示:

  1. (function(val) { 
  2.   console.log(val); 
  3. })("我是自執(zhí)行匿名函數(shù)"); 

我們發(fā)現(xiàn)上述代碼的寫法正好是立即執(zhí)行函數(shù)的第一種寫法??

寫在最后

至此,文章就分享完畢了。

責(zé)任編輯:武曉燕 來源: 神奇的程序員K
相關(guān)推薦

2021-09-26 09:59:14

MYSQL開發(fā)數(shù)據(jù)庫

2019-11-05 10:03:08

callback回調(diào)函數(shù)javascript

2021-10-16 17:53:35

Go函數(shù)編程

2020-07-24 10:00:00

JavaScript執(zhí)行上下文前端

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過濾器

2020-12-16 09:47:01

JavaScript箭頭函數(shù)開發(fā)

2010-06-28 10:12:01

PHP匿名函數(shù)

2009-11-18 12:38:04

PHP字符串函數(shù)

2009-09-25 09:14:35

Hibernate日志

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis

2013-09-22 14:57:19

AtWood

2017-08-15 13:05:58

Serverless架構(gòu)開發(fā)運維

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-01-10 08:48:21

2020-09-23 10:00:26

Redis數(shù)據(jù)庫命令

2025-06-05 05:51:33

2024-02-21 21:14:20

編程語言開發(fā)Golang
點贊
收藏

51CTO技術(shù)棧公眾號

91精品国产乱码久久久竹菊| 国产精品二线| 日韩中字在线| 欧美一区二区三区免费视频| 视色,视色影院,视色影库,视色网| 国产又色又爽又黄又免费| 欧美一区激情| 亚洲精品久久久久| 一女被多男玩喷潮视频| 国产无套粉嫩白浆在线2022年| 日韩电影在线观看一区| 日韩视频在线免费| 精品伦一区二区三区| 午夜欧美激情| 中文字幕一区日韩精品欧美| 国产成人精品免费视频大全最热| 国产微拍精品一区| 久久国产亚洲| 亚洲福利视频网| 欧美精品无码一区二区三区| 午夜小视频在线观看| 26uuu精品一区二区在线观看| 国产精品久久久久久久久影视| 国产大屁股喷水视频在线观看| 视频二区欧美| 欧美在线观看你懂的| 成人毛片100部免费看| 男男激情在线| 成人免费av在线| 国产精品一区二区女厕厕| 久久中文字幕在线观看| 操欧美老女人| 欧美mv日韩mv国产网站app| 精品久久久久久中文字幕2017| 中文av资源在线| 欧美国产一区二区在线观看| 国产精品国产精品| 国产一区二区三区三州| 免费亚洲网站| 久久久午夜视频| 懂色av粉嫩av蜜臀av一区二区三区| 九九热播视频在线精品6| 欧美精品乱码久久久久久按摩| 免费看国产曰批40分钟| 影音先锋中文在线视频| 国产精品九色蝌蚪自拍| 日本高清不卡一区二区三| 黄色av一区二区三区| 久久成人免费电影| 日韩免费av在线| 国产精品6666| 国产综合精品一区| 欧美成人午夜视频| 天天色天天综合| 精品久久久中文字幕| 国产丝袜一区二区三区| 黄色国产在线观看| 久草精品视频| 欧美精品一区在线观看| 性感美女一区二区三区| 精品视频在线一区| 91精品国产免费| 午夜xxxxx| 久久av网站| 91精品国产综合久久精品app | 午夜性色福利影院| 成人性生交大片免费看视频在线 | 免费在线观看黄色小视频| 精品国产乱码久久久久久1区2匹| 亚洲欧洲一区二区三区在线观看| 30一40一50老女人毛片| 久久成人av| 一区二区三区精品99久久| 偷偷色噜狠狠狠狠的777米奇| 成人激情自拍| 欧美哺乳videos| 久久久久久久人妻无码中文字幕爆| 亚洲经典视频| 亚洲第一av网站| 国产一级伦理片| 亚洲视频分类| 中文字幕av一区| 欧美另类69xxxx| 亚洲成人精品| 欧美黄色片免费观看| 五月天婷婷丁香| 亚洲一区日韩在线| 国产成人精品久久亚洲高清不卡| 国产情侣小视频| 精品在线观看视频| 91在线短视频| 视频一区二区免费| www.在线成人| 亚洲成人自拍| а√天堂在线官网| 亚洲大尺度视频在线观看| 18禁免费无码无遮挡不卡网站| 亚洲欧美韩国| 欧美人成免费网站| 日本三级日本三级日本三级极| 欧美精品中文| 啊v视频在线一区二区三区| 欧美黄色免费观看| 人妻精品一区二区三区| 成人中文字幕合集| 欧美一区二区三区在线播放| 在线观看免费版| 性欧美疯狂xxxxbbbb| 嫩草av久久伊人妇女超级a| 在线免费观看亚洲| 亚洲精品www久久久| 日本一区二区视频在线播放| 欧美福利视频| 国产精品旅馆在线| 亚洲精品一区二区三区四区| 国产亚洲婷婷免费| 成人免费网站入口| 电影亚洲一区| 亚洲国产精品99| 99久久99久久精品免费看小说. | 国产精品av一区| 国产福利小视频在线| 一区二区在线观看不卡| 成人羞羞国产免费网站| 91成人在线精品视频| 在线观看国产精品日韩av| 国产乡下妇女做爰视频| 精品制服美女久久| 日韩不卡av| h片视频在线观看| 欧美精品一卡二卡| 日韩片在线观看| 欧美日韩亚洲一区| 国产啪精品视频| 色吊丝在线永久观看最新版本| 国产精品第一页第二页第三页| 日本中文字幕网址| 日本在线视频一区二区三区| 中文日韩在线观看| 久久精品久久久久久久| 精彩视频一区二区三区| 日韩欧美精品久久| 亚洲女同av| 亚洲高清色综合| 久久久久久久久精| 韩国v欧美v日本v亚洲v| 一区二区不卡视频| 美女100%一区| 精品一区二区电影| 久久伊人91精品综合网站| 青青草偷拍视频| 国产一二精品视频| 蜜臀av.com| 婷婷视频一区二区三区| 欧美精品福利在线| 天天干在线观看| 色综合欧美在线| 性欧美精品男男| 美日韩一区二区三区| 免费观看黄色大片| 中文字幕久久精品一区二区| 午夜精品理论片| 精品无吗乱吗av国产爱色| 欧美午夜精品一区| 欧美另类videoxo高潮| 国产一区在线观看视频| 欧美男女爱爱视频| 九一亚洲精品| 91在线高清免费观看| 黄色成人在线网| 精品亚洲va在线va天堂资源站| 日本黄色一级视频| 日韩一区在线看| 国产人妻黑人一区二区三区| 丝袜美腿亚洲色图| 97超碰免费观看| 欧美变态网站| 国产啪精品视频| heyzo一区| 国产亚洲一区精品| 国产丰满美女做爰| 欧美日韩日本国产| sm捆绑调教视频| 99精品视频中文字幕| 91香蕉视频污版| 亚洲小说欧美另类社区| 日韩福利影院| 97久久亚洲| 国产美女91呻吟求| 久热在线观看视频| 日韩性生活视频| 五月婷婷在线播放| 欧美人狂配大交3d怪物一区 | 岛国av午夜精品| 极品色av影院| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲国产成人va在线观看麻豆| 伊人久久久大香线蕉综合直播| 茄子视频成人在线观看 | 亚洲欧洲视频在线| www.黄色国产| 在线日韩一区二区| 国语对白一区二区| 中文字幕日韩一区二区| 少妇光屁股影院| 国产成人午夜电影网| 一区二区三区免费播放| 在线亚洲精品| 青青草免费在线视频观看| 国产一区二区三区网| 国产欧美日韩一区| 国产在线视频欧美一区| 国产成人免费av| av3级在线| 欧美精品一二区| 在线a人片免费观看视频| 日韩av中文字幕在线| 性欧美8khd高清极品| 欧美精品在线观看一区二区| 精人妻无码一区二区三区| 精品国产999| 久久久久成人精品无码| 亚洲理论在线观看| 国产白丝一区二区三区| 久久蜜桃一区二区| 草草地址线路①屁屁影院成人| 高潮精品一区videoshd| 亚洲国产欧美91| 国产综合色在线视频区| 色综合色综合色综合色综合| 丝袜美腿高跟呻吟高潮一区| 国产成人无码精品久久久性色| 亚洲大黄网站| 99在线免费视频观看| 欧美日韩午夜| 青少年xxxxx性开放hg| 欧美亚洲国产激情| 欧美亚洲另类久久综合| 国产精品视频一区二区三区四蜜臂| 狠狠色狠狠色综合人人| 荡女精品导航| 国产综合av一区二区三区| 成午夜精品一区二区三区软件| 国产精品久久九九| 国产精品45p| 好吊妞www.84com只有这里才有精品 | 色综合色综合色综合色综合色综合 | 翡翠波斯猫1977年美国| 日韩精品成人在线观看| 97人人干人人| 国产伦理久久久久久妇女 | 国产v综合ⅴ日韩v欧美大片| 久久精品女人天堂av免费观看| 日本高清久久天堂| 国产另类xxxxhd高清| 国产精品久久久久久久天堂| 69堂精品视频在线播放| 国产免费一区二区三区在线能观看| 成人黄页网站视频| 91久久国产婷婷一区二区| 一区二区三区免费在线看| 国产精品露出视频| 午夜精品福利影院| 亚洲成人网上| 综合日韩在线| 三上悠亚久久精品| 日韩av一区二区三区四区| 91精品999| 国产福利一区在线| 91成人在线观看喷潮蘑菇| 99久久伊人久久99| 国产又大又粗又爽的毛片| 日韩一区在线免费观看| 日本一级黄色大片| 色94色欧美sute亚洲13| 一区二区视频免费观看| 日韩精品一区二区三区四区| 无码精品黑人一区二区三区| 国产亚洲欧美一区| www.欧美日本韩国| 欧美中文字幕在线观看| crdy在线观看欧美| 久久精品国产一区二区三区日韩| 成人久久一区| av网站大全免费| 男女男精品网站| 蜜桃色一区二区三区| 国产欧美日本一区二区三区| 黄色在线观看免费| 色老头久久综合| 999精品国产| 日韩国产精品一区| 黄色av电影在线播放| 欧美在线观看日本一区| 成人在线日韩| 日韩av电影在线观看| 国产一区视频在线观看免费| 久久久久久三级| 成人禁用看黄a在线| 久久久久麻豆v国产| 午夜av电影一区| 国产伦一区二区| 亚洲人成亚洲人成在线观看| 在线xxxx| 国产精品私拍pans大尺度在线| 日韩一区免费| 亚洲一卡二卡三卡四卡无卡网站在线看| 一区二区三区国产在线| xxxxwww一片| 国产精品三级电影| 国产精品视频123| 精品sm在线观看| 国产成人高清精品| 国产精品免费小视频| 尤物tv在线精品| 大西瓜av在线| 国产老肥熟一区二区三区| 精品丰满少妇一区二区三区| 色综合久久久久网| 人成网站在线观看| 欧美国产中文字幕| 成人污版视频| 在线视频不卡国产| 免费黄网站欧美| 一级片视频免费看| 色婷婷精品久久二区二区蜜臂av| 人妻夜夜爽天天爽| 久久人人爽人人| 91久久偷偷做嫩草影院电| 一区高清视频| 久久精品99久久久| 国产又粗又硬视频| 欧日韩精品视频| a天堂在线资源| 国产精品专区一| 欧美一二区在线观看| 999在线免费视频| 国产欧美在线观看一区| 日本视频网站在线观看| 亚洲欧美精品在线| 香蕉成人av| 亚洲国产午夜伦理片大全在线观看网站 | 日韩在线网址| 日本福利视频网站| 国产不卡一区视频| 久久精品国产亚洲av麻豆色欲| 日韩精品在线网站| 欧美大胆的人体xxxx| 国产精品乱子乱xxxx| 激情综合久久| 日本一级片在线播放| 日韩欧亚中文在线| 国产网站在线播放| 成人黄色av免费在线观看| 天天操夜夜操国产精品| 亚洲图片 自拍偷拍| 一区二区三区在线观看网站| 亚洲精品视频网| 午夜精品一区二区三区在线视| 日本欧美高清| 校园春色 亚洲色图| 国产欧美日韩精品一区| 亚洲最大成人av| 欧美精品成人在线| 中文字幕av一区二区三区人| 最新中文字幕2018| 亚洲男人电影天堂| 五月色婷婷综合| 国产精品成人播放| 中文字幕亚洲精品乱码| 国产精品入口麻豆| 色婷婷精品久久二区二区蜜臂av| 欧美18hd| 国产精选在线观看91| 日韩vs国产vs欧美| 唐朝av高清盛宴| 亚洲欧美色婷婷| 国产精品xnxxcom| 毛片在线播放视频| 国产精品福利一区二区| 国产91绿帽单男绿奴| 日韩美女主播视频| 欧美一区二区三区另类 | 精品毛片在线观看| 日韩av电影在线播放| 久久久久久久久丰满| 亚洲天堂成人av| 欧美美女视频在线观看| 成人三级高清视频在线看| 亚洲二区自拍| 成人av电影在线观看| 一二三区在线播放| 69av视频在线播放| 亚洲一区二区| 波多野在线播放| 亚洲成人av中文字幕| 欧洲美女精品免费观看视频| 欧美性大战久久久久xxx| 亚洲色图另类专区| 国产玉足榨精视频在线观看|