亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

JavaScript基礎篇(6)之函數表達式閉包

2024-05-06 16:26:06
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了javascript基礎篇(6)之函數表達式閉包的相關資料,需要的朋友可以參考下
 

 其實js支持函數閉包的主要原因是因為js需要函數能夠保存數據。這里的保存數據是只函數在運行結束以后函數內變量的值也會進行保存。至于為什么js需要在函數內可以保存數據,那就是js是一種函數式語言。在函數內保存數據是函數式語言的一大特征。

回顧前面介紹過的三種定義函數方式

functiosu(numnumreturnunum//函數聲明語法定義
vasufunction(numnum)returnunum}//函數表達式定義
vasuneFunction("num""num""returnunum")//Functio構造函數

在分析閉包之前我們先來看看,定義和調用函數容易犯的錯誤。

例1:

sayHi(); //錯誤:函數還不存在var sayHi = function () {  alert("test");};

例2:

if (true) {  function sayHi() {    alert("1");  }} else {  function sayHi() {    alert("2");  }}sayHi();//打印結果并不是我們想要的

例3:

var fun1 = function fun2() {  alert("test");}fun2();//錯誤:函數還不存在

在例1中,我們不能在使用函數聲明式語法定義之前調用函數。解決方案:

1.如果使用函數表達式定義函數的話,需要在表達式定義后調用。

var sayHi = function () {  alert("test");};sayHi()

2.使用函數聲明式。(這里瀏覽器引擎會 函數聲明提升, 在所有代碼執行之前先讀取函數聲明)

sayHi(); function sayHi () {  alert("test");};

在例2中,我們預期的結果應該是打印1,實際結果是打印2。

if (true) {  function sayHi() {   alert("1");  }  } else {  function sayHi() {   alert("2");  }}sayHi();//打印結果并不是我們想要的

為什么會這樣?正因為 函數聲明提升 ,所以瀏覽器在預解析的時候不會判斷if條件,直接解析第二個函數定義的時候覆蓋了第一個。

解決方案:

var sayHi;if (true) {  sayHi = function () {   alert("1");  }  } else {  sayHi = function () {   alert("2");  }}sayHi();

在例3中,發現只能只用fun1()調用,而不能使用fun2()調用。

我自己的理解,真正原因不知道。沒找到資料。

因為1: function fun3() { }; 等效與  var fun3 = function fun3() { }; 如圖:

JavaScript基礎篇(6)之函數表達式閉包 

所以只能只用fun1()調用,而不能使用fun2()調用。

其實這里我還是有疑問的?哪位大神知道,望告知。

既然,fun2在外面不能調用為什么在函數內部能調用?雖然在debugger還是得不到fun1。

JavaScript基礎篇(6)之函數表達式閉包

好了,通過上面的三道題目熱身。我們繼續今天的主題“閉包”。

1.什么是閉包?

定義:就是有權訪問另一個函數作用域的變量的函數

我們先從一個示例函數開始:

例1:

function fun() {  var a = "張三";}fun();//在我們執行完后,變量a就被標記為銷毀了

例2:

function fun() {  var a = "張三";  return function () {    alert("test");  }}var f = fun();//同樣,在我們執行完后,變量a就被標記為銷毀了

例3:

function fun() {  var a = "張三";  return function () {    alert(a);  }}var f = fun();//【現在情況發生變化了,如果a被銷毀,顯然f被調用的話就不能訪問到變量a的值了】f();//【然后變量a的值正常的被訪問到了】//這就是閉包,當函數A 返回的函數B 里面使用到了函數A的變量,那么函數B就使用了閉包。示例:function fun() {  var a = "張三";  return function () {   alert(a);  }}var f = fun();//【現在情況發生變化了,如果a被銷毀,顯然f被調用的話就不能訪問到變量a的值了】f();//【然后變量a的值正常的被訪問到了】

顯然,濫用閉包會增大內存的使用。所以非特殊情況盡量不要使用閉包。如果用到了,記得手動設置空引用,內存才能被回收 f = null ;

圖解:(不了解作用域鏈的同學請先看前面的文章 作用域和作用域鏈 )

JavaScript基礎篇(6)之函數表達式閉包

2.什么是匿名函數? (僅僅只是解釋這個概念)

如:(即,沒有名字的函數)

JavaScript基礎篇(6)之函數表達式閉包

關于對象中函數的返回值是匿名函數時,this的怪異現象

講解之前,先清醒下頭腦,不要越看越迷糊了。如果迷糊了,那就直接忽略下面的。

var name1 = "張三";var obj = {  name1: "李四",        fun2: function () {    alert(this.name1);  },  fun3: function () {    return function () {      alert(this.name1);    }  }}

obj.fun2();//打印結果"李四"意料之中的。
obj.fun3()();//因為這里返回的是一個函數,所以要再加一對()來調用。打印結果是"張三",意料之外。
//真是百事不得其解啊,什么this指向了全局?
我們前面講過“ 哪個對象點出來的方法,this就是哪個對象 ”,那我們的  obj.fun3()() 打印的是“張三”也就是說this執行了全局作用域。

我們看看下面的示例也許就知道為什么了。

var name1 = "張三";var obj = {  name1: "李四",        fun2: function () {    alert(this.name1);  },  fun3: function () {    return function () {      alert(this.name1);    }  }}    //obj.fun3()();var obj2 = {};obj2.name1 = "test";obj2.fun = obj.fun3();obj2.fun();//打印結果"test",再次證明了“哪個對象點出來的方法,this就是哪個對象”.var name1 = "張三";var obj = {  name1: "李四",  fun2: function () {   alert(this.name1);  },  fun3: function () {    return function () {     alert(this.name1);    }  }}//obj.fun3()();var obj2 = {};obj2.name1 = "test";obj2.fun = obj.fun3();obj2.fun();//打印結果"test",再次證明了“哪個對象點出來的方法,this就是哪個對象”.

我們來分解下 obj.fun3()() 先是  obj.fun3() 返回一個匿名函數到了window作用域,然后接著調用this就指向了window了。( 感覺解釋有點勉強,也不知道對不,暫時自己先是這么理解的 )

閉包形成的原因:內存釋放問題

一般,當函數執行完畢后,局部活動對象會被銷毀,內存中僅保存全局作用域,但閉包的情況是不一樣的。

閉包的活動對象依然會保存在內存中,于是像上例中,函數調用返回后,變量i是屬于活動對象里面的,就是說其棧區還沒有釋放,但你調用c()的時候i變量保存的作用域鏈從b()->a()->全局去尋找作用域var i聲明所在,然后找到了var i=1;然后在閉包內++i;結果,最后輸出的值就是2了;

以上所述是小編給大家分享的JavaScript基礎篇(6)之函數表達式閉包,希望大家喜歡。



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91超碰中文字幕久久精品| 97人洗澡人人免费公开视频碰碰碰| 久久久精品日本| 一区二区欧美久久| 国产成人亚洲精品| 久久久www成人免费精品| 久久久久久中文字幕| 最近中文字幕mv在线一区二区三区四区| 亚洲国产欧美一区二区丝袜黑人| 久久亚洲综合国产精品99麻豆精品福利| 亚洲色图国产精品| 国产精品中文字幕在线观看| 亚洲国模精品私拍| 国内精品久久久久久久| 国产精品美女午夜av| 国产精品人成电影在线观看| 国产精品免费久久久久久| 精品国模在线视频| 国产午夜一区二区| 欧美精品一本久久男人的天堂| 午夜精品视频网站| 91国偷自产一区二区三区的观看方式| 午夜精品一区二区三区在线视频| 视频直播国产精品| 91超碰中文字幕久久精品| 日韩在线不卡视频| 国产成人精品在线播放| 成人两性免费视频| 18性欧美xxxⅹ性满足| 国产精品久久婷婷六月丁香| 第一福利永久视频精品| 91在线免费观看网站| 久久成年人视频| 一区二区三区精品99久久| 亚洲欧美制服中文字幕| 91嫩草在线视频| 欧美在线视频一区二区| 伊人伊人伊人久久| 亚洲自拍偷拍色片视频| 欧美日韩亚洲成人| 国产欧美久久久久久| 国产精品影片在线观看| 国产精品欧美一区二区三区奶水| 日韩高清电影好看的电视剧电影| 国产精品专区第二| 91免费综合在线| 精品国产乱码久久久久酒店| 欧美极品少妇全裸体| 久久久久久久激情视频| 成人欧美一区二区三区在线湿哒哒| 久久久久久网址| 91夜夜揉人人捏人人添红杏| 久久国产精品久久精品| 热99精品只有里视频精品| 久久久久在线观看| 亚洲精品国产精品国产自| 色yeye香蕉凹凸一区二区av| 色午夜这里只有精品| 98午夜经典影视| 久久韩剧网电视剧| 亚洲免费电影一区| 午夜剧场成人观在线视频免费观看| 亚洲精品午夜精品| 国产v综合ⅴ日韩v欧美大片| 久久人人爽国产| 亚洲自拍欧美另类| 国内精品久久久久久中文字幕| 国产日韩欧美视频在线| 亚洲xxxx3d| 欧美精品videosex极品1| 一本色道久久88综合日韩精品| 美女999久久久精品视频| 国产中文字幕91| 国产丝袜一区二区三区免费视频| 国产欧美日韩高清| 人妖精品videosex性欧美| 欧美性xxxx在线播放| 欧美黑人xxxx| 日韩第一页在线| 91精品国产777在线观看| 动漫精品一区二区| 91精品视频在线播放| 精品国产美女在线| 国产一区二区三区毛片| 国产一区二区三区视频| 亚洲一区精品电影| 日韩在线中文字幕| 久久九九国产精品怡红院| 欧美高清视频一区二区| 亚洲国产成人爱av在线播放| 欧美国产日韩一区二区在线观看| 亚洲国产精品小视频| 亚洲国产精品一区二区三区| 亚洲a一级视频| 日韩精品免费一线在线观看| 久久久噜噜噜久久久| 黄色一区二区在线观看| 精品视频久久久| 久久久免费高清电视剧观看| 亚洲午夜女主播在线直播| 成人福利免费观看| 亚洲色图日韩av| 国产欧美日韩专区发布| 中文字幕亚洲一区二区三区| 免费99精品国产自在在线| 亚洲福利视频网站| 久久久午夜视频| 538国产精品一区二区在线| 欧美最猛性xxxxx免费| 日本不卡高字幕在线2019| 精品亚洲aⅴ在线观看| 国产精品久久久久久久久久99| 91精品国产高清久久久久久久久| 久久夜色精品国产亚洲aⅴ| 亚洲国产精品成人一区二区| 色综合久综合久久综合久鬼88| 精品久久久免费| 欧美激情在线视频二区| 国产91精品青草社区| 日本高清视频一区| 国产精品日韩一区| 日韩av在线一区二区| 欧美精品久久久久久久久久| 久久久91精品| 国产午夜精品美女视频明星a级| 成人在线观看视频网站| 久久这里有精品视频| 97精品国产97久久久久久| 久久综合久久八八| 2020欧美日韩在线视频| 久久在线免费视频| 国产aⅴ夜夜欢一区二区三区| 亚洲一品av免费观看| 狠狠躁夜夜躁人人躁婷婷91| 欧美色视频日本高清在线观看| 国产主播精品在线| 国产日产亚洲精品| 欧洲永久精品大片ww免费漫画| 久久精品人人做人人爽| 日韩精品视频中文在线观看| 亚洲电影免费观看高清| 日韩av电影免费观看高清| 成人欧美在线视频| 九九热r在线视频精品| 国产综合香蕉五月婷在线| 精品国产美女在线| 日韩电影在线观看中文字幕| 日韩精品久久久久久久玫瑰园| 95av在线视频| 亚洲欧美一区二区三区久久| 欧美日韩一区二区免费在线观看| 国产精品国语对白| 91精品中国老女人| 欧美日韩国产色视频| 主播福利视频一区| 亚洲国产古装精品网站| 91色视频在线导航| 国产亚洲精品成人av久久ww| 亚洲精品美女在线观看| 欧美日韩精品在线观看| 国产一区二区三区18| 欧美中文字幕第一页| 欧美午夜影院在线视频| 亚洲一区二区在线播放|