精品欧美一区二区三区在线观看 _久久久久国色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超碰中文字幕久久精品| 国产精品色悠悠| 国产免费无码一区二区| 中文字幕+乱码+中文乱码www| 日韩影片在线观看| 国产精品嫩草影院av蜜臀| 91精品国产91久久久久久久久| 永久免费看mv网站入口78| xxxx成人| 欧美激情麻豆| 欧美浪妇xxxx高跟鞋交| 日韩免费av电影| 青草视频在线观看免费| 国产成人av毛片| 亚洲精品欧美激情| 成人免费淫片aa视频免费| youjizz亚洲女人| 色老太综合网| 久久久99精品久久| 日韩女在线观看| 老鸭窝一区二区| 涩涩涩视频在线观看| 成人深夜视频在线观看| 韩国视频理论视频久久| 在线精品视频播放| 国产xxxxxxxxx| 在线免费观看麻豆| 欧美1区2区3| 一区二区三区四区乱视频| 亚洲自拍在线观看| 欧美成人综合色| 日韩激情综合| 欧美视频自拍偷拍| 伊人色综合影院| 国产又粗又猛又黄| 三级小说欧洲区亚洲区| 狠狠色狠狠色综合日日小说| 久久精品日产第一区二区三区| 尤物视频在线观看国产| 色天下一区二区三区| 欧美一级高清大全免费观看| 国产欧美久久久久| 免费观看黄一级视频| 亚洲激情综合| 亚洲视频在线观看视频| 一路向西2在线观看| 黄av在线播放| 成人黄色国产精品网站大全在线免费观看| 欧美精品18videos性欧美| 影音先锋人妻啪啪av资源网站| 另类图片综合电影| 国产精品国产精品国产专区不片| 成人免费福利视频| 日本xxxxxxx免费视频| 欧美激情国产精品日韩| 你懂的免费在线观看视频网站| 久久久精品网| 中文字幕一区二区三区电影| 免费av不卡在线| 牛牛在线精品视频| 国产亚洲精品免费| 亚洲在线观看视频网站| 国产精品国产精品国产专区| 久久精品国产77777蜜臀| 欧美激情亚洲视频| 国产一级片免费| 国内精品久久久久久久影视简单| 91精品国产欧美一区二区18| 国产精品网站免费| 久久综合之合合综合久久| 国产精品久久久一区麻豆最新章节| 亚洲春色在线| 五月婷婷在线播放| 麻豆极品一区二区三区| 国产日韩精品在线观看| 黄色一级片免费看| 午夜在线一区| 欧美国产亚洲精品久久久8v| 在线观看国产精品一区| 4438全国亚洲精品观看视频| 欧美少妇性性性| 蜜桃传媒一区二区三区| 亚洲优女在线| 亚洲午夜三级在线| 色香蕉在线观看| 日韩精品系列| 成人黄色网址在线观看| 久久久久se| av在线之家电影网站| 不卡视频在线观看| 欧美日韩国产精品一卡| 亚洲男人天堂久久| 国内精品久久久久影院色| 57pao国产成人免费| 久久亚洲精品大全| 欧美一区在线看| 91超碰caoporn97人人| 中文字幕有码视频| 成人午夜av电影| 日韩av一区二区三区美女毛片| 国产视频在线播放| 欧美日韩国产丝袜另类| 国产一级片自拍| 精品三级av在线导航| 日韩精品一区国产麻豆| 视频区 图片区 小说区| 亚洲视频资源| 欧美三区在线视频| zjzjzjzjzj亚洲女人| 天堂va欧美ⅴa亚洲va一国产| 日韩乱码在线视频| 538国产视频| 久久一级电影| 色香阁99久久精品久久久| 调教驯服丰满美艳麻麻在线视频| 欧美国产三级| 国产精品免费一区| 天天干天天爽天天操| av一二三不卡影片| 精品视频一区在线| 日本天堂在线| 亚洲人妖av一区二区| 欧美爱爱视频网站| 成人免费看视频网站| 欧美变态凌虐bdsm| 99久久免费看精品国产一区| 久久亚洲精品中文字幕蜜潮电影| 欧美最猛性xxxxx免费| 91玉足脚交嫩脚丫在线播放| 国产精品18久久久久久久久久久久| 91精品视频网站| www.成人在线观看| 成人高清在线视频| 超碰97免费观看| av免费在线一区| 91麻豆精品国产自产在线| 亚洲高清av一区二区三区| 国产欧美日韩精品一区二区三区 | 91久久精品国产91性色| 国产日本在线| 国产精品蜜臀在线观看| 日韩人妻精品无码一区二区三区| 亚洲www.| 亚洲欧美中文在线视频| 国产三级av片| 免费在线观看视频一区| 99国产超薄肉色丝袜交足的后果 | 成人精品三级| 亚洲欧洲日韩国产| 日韩在线 中文字幕| 老司机精品视频一区二区三区| 欧美极品色图| 国产精品迅雷| 亚洲天堂男人天堂女人天堂| 久久久久99精品成人| 国内综合精品午夜久久资源| 日韩免费在线视频| 国产日韩精品在线看| 在线视频你懂得一区二区三区| 亚洲女人在线观看| 欧美在线网站| 懂色av一区二区三区在线播放| 日本1级在线| 色婷婷精品大视频在线蜜桃视频| 想看黄色一级片| 四虎5151久久欧美毛片| 4438全国成人免费| 国产精品一级伦理| 欧美日韩三级视频| 麻豆av免费观看| 日韩主播视频在线| 国产精品福利视频| 黄色片在线看| 亚洲国产综合91精品麻豆| 日本50路肥熟bbw| 国产农村妇女毛片精品久久莱园子| 国产免费一区二区三区在线能观看| 亚洲美女综合网| 婷婷国产在线综合| 中文字幕1区2区| 99综合精品| 97操在线视频| 尤物网在线观看| 91福利视频在线| 中文字幕一区二区三区人妻| 日韩精品成人一区二区三区| 在线不卡日本| 国产精品视频3p| 国产精品入口尤物| 欧美人与性动交α欧美精品济南到 | 国产性猛交xxxx免费看久久| 国产精品久久久久久69| 亚洲成人在线免费| 在线观看日本www| 区一区二视频| 国产成人久久精品| 免费在线黄色网址| 5月丁香婷婷综合| 韩国av中文字幕| 亚洲视频在线一区观看| 波多野结衣影院| 久久99国产精品尤物| 一区二区av| 成人黄页网站视频| 亚洲欧美中文日韩在线| 国产aⅴ一区二区三区| 亚洲欧美成aⅴ人在线观看| 疯狂揉花蒂控制高潮h| 国产亚洲欧洲| 福利在线小视频| 视频精品一区| 国产精品久久不能| av播放在线| 欧美另类一区二区三区| 男女视频免费看| 亚洲精品视频自拍| 欧美巨胸大乳hitomi| 97精品国产露脸对白| 欧美女人性生活视频| 你懂的国产精品永久在线| 欧美人与性禽动交精品| 91蜜桃臀久久一区二区| 2018中文字幕一区二区三区| 粗大黑人巨茎大战欧美成人| 日韩欧美一区二区视频| 亚洲综合一区中| 亚洲精选一二三| 亚洲一区 欧美| 久久精品亚洲一区二区三区浴池| 影音先锋资源av| 国产不卡免费视频| 中文字幕日本最新乱码视频| 国产精品www994| 伊人久久大香线蕉综合75| 精品国内自产拍在线观看视频| 国产精品欧美日韩久久| videos性欧美另类高清| 97在线观看免费| 久久99亚洲网美利坚合众国| 欧美另类极品videosbest最新版本| 亚洲精品97久久中文字幕| 亚洲成av人片观看| av手机在线播放| 国产一区二区福利视频| 97超碰国产精品| 午夜亚洲福利| 精品人妻人人做人人爽| 国产精品v一区二区三区| 蜜臀av性久久久久蜜臀av| 高清日韩中文字幕| 国产精品 日韩| 超碰成人在线免费| 国产精品99久久久久久久| 亚洲精品高潮| 国产精品一区二区三区观看 | 国产精品一区而去| 欧美尿孔扩张虐视频| 国产精品人人做人人爽| www.久久.com| 91久久精品视频| 在线精品国产亚洲| 久久人人爽爽人人爽人人片av| 三级精品视频| 亚洲狠狠婷婷综合久久久| 99久久精品费精品国产| 久久久水蜜桃| 精品一区在线| 成人欧美一区二区三区黑人免费| 一区二区三区自拍视频| 国产精品三区在线| 亚洲aa在线| 国产精品国色综合久久| 九色丨蝌蚪丨成人| 欧美少妇一区| 久久精品青草| 亚洲国产一区在线| 欧美二区不卡| 国产a级一级片| 免费成人av在线| av影片在线播放| 91免费视频观看| 国产大学生视频| 久久久久久久久久看片| 免费成人美女女在线观看| 久久精品人人爽人人爽| 成人欧美一区二区三区黑人一| 亚洲伦理在线精品| 久久99精品波多结衣一区| 欧美裸体bbwbbwbbw| 色呦呦中文字幕| 中文字幕亚洲一区| 成年女人在线看片| 久久久久久久久久久久久久久久久久av | 欧美激情视频在线观看| 久久毛片亚洲| 999精品视频一区二区三区| 综合综合综合综合综合网| 在线丝袜欧美日韩制服| 国产精品毛片一区二区三区| 亚洲午夜激情影院| 久久亚洲精华国产精华液 | 久久久精品免费免费| 日本午夜在线观看| 综合色中文字幕| 精品丰满少妇一区二区三区| 亚洲线精品一区二区三区| 五月婷婷六月婷婷| 91福利社在线观看| 亚洲精品久久久久久无码色欲四季 | а 天堂 在线| 久久精品视频一区二区三区| 免费中文字幕在线观看| 一区二区三区在线不卡| 欧美日韩一级黄色片| 精品国产百合女同互慰| 无码国产精品一区二区免费16| 日韩在线一区二区三区免费视频| 国内精彩免费自拍视频在线观看网址| 国产综合在线观看视频| 久久99国产精一区二区三区| 蜜臀av无码一区二区三区| 一区二区三区成人精品| 日韩高清在线一区二区| 国产精品嫩草99a| 无码人妻精品一区二区三区不卡| 在线免费观看不卡av| 日批视频免费播放| 欧美黑人视频一区| 久久丁香四色| 正在播放91九色| 看国产成人h片视频| 精品无码在线观看| 欧美日韩国产中字| 性感美女视频一二三| 久久久久久久久久国产| 91亚洲无吗| 嫩草影院中文字幕| 国产成人精品一区二| 欧美色图一区二区| 日韩欧美卡一卡二| fc2ppv国产精品久久| 91久久国产精品| 亚洲国产日韩欧美在线| 天堂av手机在线| 亚洲人妖av一区二区| www.99视频| 久久久久久久久久久人体| 超碰成人97| 国产亚洲综合视频| 国产日韩成人精品| 欧美激情一区二区三区免费观看| 欧美一区二区三区色| а√天堂官网中文在线| 51精品国产人成在线观看| 欧美成人首页| 亚洲啪av永久无码精品放毛片| 五月婷婷久久综合| 人成免费电影一二三区在线观看| 欧美在线视频一区| 欧美视频免费| 不用播放器的免费av| 亚洲码国产岛国毛片在线| 亚洲黄色小说网址| 欧美专区日韩视频| 久久免费av| 妖精视频在线观看| 国产拍揄自揄精品视频麻豆| 黄色一级视频免费| 亚洲国产精品va在线| 国产在线1区| 国产精品免费观看高清| 国产精品综合色区在线观看| 天天操天天舔天天射| 在线电影院国产精品| h片视频在线观看| 亚洲自拍偷拍色图| 亚洲国产高清一区二区三区| 人妻无码一区二区三区| 欧美图片一区二区三区| 亚洲丝袜精品| 国产日韩精品入口| 欧美三区在线| 亚洲天堂2018av| 久久久蜜臀国产一区二区| 中日精品一色哟哟| 欧美激情第1页| 欧洲美女日日| 深夜视频在线观看| 在线国产亚洲欧美| 宅男网站在线免费观看| 国产欧美在线播放| 欧美日韩国产在线一区| 亚洲AV无码国产成人久久| 91麻豆精品国产91久久久使用方法 | 久久久国产欧美| 久久久久久久久97黄色工厂| 91精品国产乱码久久| 欧美一级高清免费播放| 亚洲电影在线一区二区三区|