成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

es6有閉包嗎

es6有閉包。在es6中,在一個函數內部創建另一個函數,把內嵌的函數稱為閉包,它可以訪問外部函數的局部變量;簡單來說,閉包指有權訪問另一個函數作用域中變量的函數。閉包的主要作用:延伸了變量的作用范圍。由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。

es6有閉包嗎

前端(vue)入門到精通課程:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調試工具:點擊使用

本教程操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

一、變量作用域

變量根據作用域的不同分為兩種:全局變量和局部變量。

  • 函數內部可以使用全局變量。

  • 函數外部不可以使用局部變量。

  • 當函數執行完畢,本作用域內的局部變量會銷毀。

二、什么是閉包?

在es6中,閉包(closure)指有權訪問另一個函數作用域中變量的函數。簡單理解:一個作用域可以訪問另外一個函數內部的局部變量。

閉包:在一個函數內部創建另一個函數,把內嵌的函數稱為閉包,它可以訪問外部函數的局部變量

	// fun 這個函數作用域 訪問了另外一個函數 fn 里面的局部變量 num     function fn(){         let num = 10         function fun(){             console.log(num)         }         fun()     }     fn() //10
登錄后復制

閉包的主要作用:延伸了變量的作用范圍。

	// fn 外面的作用域可以訪問fn 內部的局部變量     function fn(){         let num = 10         // 方法一: 先定義再返回函數         function fun(){             console.log(num)         }         return fun //返回 fun函數     }     let f = fn()     f() //10
登錄后復制

	// fn 外面的作用域可以訪問fn 內部的局部變量     function fn(){         let num = 10         // 方法二: 直接返回函數         return function(){             console.log(num)         }     }     let f = fn()     f() //10
登錄后復制

三、閉包的使用場景

(1)用來返回值

//以閉包的形式將 name 返回 function fun(){     let name = 'woniu'      //定義閉包     return function f1(){         return name     } }  let ft = fun() //因為fun函數的返回值是f1函數,ft實質是一個函數  let na = ft()  //調用ft函數,實際調用的就是f1函數 console.log(na); //woniu
登錄后復制

(2)函數賦值:在函數內部定義函數表達式

var f2 function fn(){     let name = '曹操'     f2 = function(){ //閉包,將外部函數的name變量作為閉包的返回值         return name     } } fn() //必須先調用fn函數,否則f2不是一個函數 console.log(f2());  //曹操
登錄后復制

(3)把閉包作為函數的參數

function fn(){     let name = '蝸牛學苑'      //定義閉包     return function callback(){         return name     } }  let f1 = fn() //將fn函數的返回值callback賦給f1 function f2(temp){     console.log(temp()) //輸出temp函數的返回值,實際調用了閉包callback } //調用f2函數:將f1作為實參傳遞給temp f2(f1)
登錄后復制

(4)立即執行函數中使用閉包

//立即執行函數 (function(){     let name = '蝸牛學苑'     let f1 = function(){         return name     }      fn2(f1) //調用fn2函數,將閉包f1作為實參傳遞給fn2函數 })()  function fn2(temp){  //temp是一個形參,接收f1     console.log(temp()); //對temp的調用,實際調用的是閉包f1 }
登錄后復制

(5)循環賦值

(function(){     for (let i = 1; i <= 10; i++) {         (             function(j){                 setTimeout(function(){                     console.log(j);                 },j*1000)             }         )(i)     } })()
登錄后復制

(6)將閉包封裝到對象中

function fun(){     let name = '蝸牛學苑'     setName = function(na){ //setName是閉包,用來設置外部函數的變量值         name = na     }     getName = function(){ //getName是閉包,用來返回外部函數的變量值         return name      }      //外部fun函數的返回值,將閉包封裝到對象中返回     return {         setUserName:setName,         getUserName:getName     } } let obj =fun() //將fun函數返回值(對象)賦給obj console.log('用戶名:',obj.getUserName()) //蝸牛學苑 obj.setUserName('石油學苑') console.log('用戶名:',obj.getUserName()) //石油學苑
登錄后復制

(7)通過閉包實現迭代

let arr = ['aa','bb','cc'] function fn(temp){ //外部函數的返回值是閉包     let i = 0     //定義閉包:迭代獲取數組元素并返回     return function(){         return temp[i++] || '數組已經遍歷結束'     } }  let f1 = fn(arr) console.log(f1()) //aa console.log(f1()) //bb console.log(f1()) //cc console.log(f1()) //數組已經遍歷結束
登錄后復制

(8)、首次區分(相同的參數,函數不會重復執行)

var fn = (function(){     var arr = [] //用來緩存的數組     return function(val){         if(arr.indexOf(val) == -1){ //緩存中沒有則表示需要執行             arr.push(val) //將參數push到緩存數組中             console.log('函數被執行了',arr);  //這里寫想要執行的函數         } else {             console.log('此次函數不需要執行');         }         console.log('函數調用完打印一下,方便查看緩存的數組:',arr);     } })()  fn(10) fn(10) fn(1000) fn(20) fn(1000)
登錄后復制

注意

(1)搞清除誰是閉包函數

(2)分清楚閉包的返回值、外部函數的返回值

四、閉包總結

  • 閉包是什么:閉包是一個函數(一個作用域可以訪問另外一個函數的局部變量)。

  • 閉包的作用是什么:延伸變量的作用范圍。

沒有產生閉包,因為并沒有局部變量,所以訪問到的是全局變量 The Window

let name = 'The Window'     let object = {         name: 'My Object',         getNameFunc(){             return function(){                 return this.name             }         }     }     let f = object.getNameFunc()     console.log(f()) //The Window
登錄后復制

產生了閉包:因為 this 在函數內部被賦值給了 that,指向的是 object 這個對象。

	let name = 'The Window'     let object = {         name: 'My Object',         getNameFunc(){             let that = this             return function(){                return that.name             }         }     }     let f = object.getNameFunc()     console.log(f()) //My Object
登錄后復制

使用閉包的注意點

1)由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。

2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。

【推薦學習:javascript視頻教程】

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
TPU色母和PA6色母的性能| 色欲AⅤ蜜臀AV免费观看| 影音先锋AV天堂| 无码丰满人妻熟妇区| 妺妺和我裸睡玩我下春雨医生 | 18禁H免费动漫无码网站| 亚洲成av人片在线观看无码| 色欲老女人人妻综合网| 少妇高潮呻吟在线观看| 欧美乱妇日本无乱码特黄大片| 久久精品国产亚洲AV大全| 国产精品久久这里只有精品| 锕锕锕锕锕锕~好深啊APP下载| 中国女人内射6XXXXXWWW| 亚洲欧美日韩久久精品| 亚洲AV日韩AV无码AV| 天天躁日日躁狠狠躁视频2021| 日本欧美午夜成人免费观看| 欧美黑人XXXX性高清版| 老头老太太GMBGMBGM| 九九精品无码专区免费| 狠狠色噜噜狠狠狠狠97俺也去| 国产精品视频永久免费播放| 国产V综合V亚洲欧美久久| 丁香婷婷激情俺也去俺来也| 餐桌下狂C亲女水欧阳凝| FRYEE性欧美18 19| CAOPORM-超频在线视频| AV无码免费一区二区三区| 中文有无人妻VS无码人妻激烈| 亚洲狠狠婷婷综合久久蜜芽| 无码性午夜视频在线观看 | AV无码中文一区二区三区四区 | 日韩午夜理论片 中文字幕| 欧美一区二区三区激情| 欧美乱强伦XXXXXXXXXX| 天天摸天天碰天天添中文无码| 亚洲精品无码久久毛片波多野吉衣 | 939W78W78W乳液特色| 自拍亚洲综合在线精品| 中国熟妇色XXXXⅩ老妇| 粗壮挺进邻居人妻无码| 处破痛哭A√18成年片免费| 国内精品久久久久影院蜜芽蜜芽T 国内精品久久久久影院蜜芽 | 国产午夜精品久久久久免费视| 国产精品嫩草影院一二三区入口| 久久精品国产亚洲AV嫖农村妇女| 人妻系列无码专区久久五月天 | 中文字幕在线观看| 国产边做饭边被躁在线小说| 国产成人AV综合久久| 久久熟妇人妻午夜寂寞影院| 蜜桃AV无码乱码精品| 男女嘿咻发声动态图| 欧美日韩精品久久久免费观看| 人妻少妇一级毛片内射一牛影视 | VIDEOS日本熟妇人妻多毛| 国产在线无码视频一区二区三区| 黑人大战欲求不满人妻| 精品人妻av无码一区二区三区| 久久精品人妻一区二区三区| 男男野战爆了我的菊BL| 无码精品A∨在线观看无广告| 在线麻豆精东9制片厂AV影现网| 国产精品不卡无码AV在线播放| 国色天香精品一卡2卡3卡老狼| 久久久久久国产精品免费免费| 免费女同毛片在线播放| 日本三级欧美三级人妇视频黑白配| 三级国产三级在线| 无码一区二区三区AⅤ免费蜜桃视 无码一区二区三区AⅤ免费麻豆 | 欧美巨大巨粗黑人性AAAAAA| 亚洲AV无码成人网站WWW| 亚洲精品偷拍区偷拍无码| 成年女人粗暴毛片免费观看| 国产精品三级在线观看无码| 欧美人与动人物XXXX9296| 亚洲国产午夜精品理论片| 国产69精品久久久久APP下载| 国产男女猛烈无遮挡免费网站| 精品无码AV无码免费专区| 毛片无遮挡高清免费| 日本日本熟妇中文在线视频| 一边摸一边叫床一边爽AV| 凹凸女BBWBBWBBWBBW| 国产激情无码一区二区三区| 精品国产AV 无码一区二区三区 | 中文字字幕在线乱码| 国精产品一区一区三区有限在线 | 日韩无码视频一区二区三区四区 | 国产精品国产三级国产专不| 人妻被按摩师玩弄到潮喷| 十八禁动漫露内裤扒开腿视频风险| 小妖精含牢了我喂饱你| 一本久道久久综合狠狠老| 成人夜间av大片免费观看| 精品久久久久久亚洲综合网| 特级毛片内射WWW无码| 亚洲AV中文无码乱人伦在线R| 37大但文体艺术A级都市天气| 丁香五月缴情网站| 女狠狠噜天天噜日日噜| 无遮挡国产高潮视频免费观看| 一区无码在线观看的| 国产精品久久久久久AV| 日日澡夜夜澡人人高潮| 啊灬啊灬啊灬快灬高潮了视频网站| 美女高潮潮喷出白浆视频| 亚洲午夜无码毛片av| 成人区人妻精品一区二区不卡网站 | 吃了继兄开的药我做的梦更 | 锕锕锕锕锕锕好多水APP网站| 男人猛戳女人30分钟视频大全| 少妇又紧又深又湿又爽视频| ATLANTICOCEAN巨大| 蜜臀AⅤ永久无码一区二区| 亚洲日产韩国一二三四区| 芭乐小猪幸福宝丝瓜草莓官网| 女人被男人吃奶到高潮 | 亚洲AV成人无码一区二区三区在 | 无遮挡边吃摸边吃奶边做| 国产AV在线观看| 四虎永久在线精品无码视频| 饭桌上故意张开腿让公在线观看| 久久人人爽人人爽人人片AV高请| 亚洲国产精品无码专区成人| 黑人巨大精品欧美黑寡妇| 亚洲va熟妇自拍无码区| 国语对白国产成人AⅤ片 | 极度另类FREESEX强行真实| 人人妻人人澡人人爽欧美精品| FREE性熟女妓女TUBE| 欧美性大战久久久久久久| AV一区二区三区人妻少妇| 免费看撕开奶罩揉吮奶头视频| 做AJ的视频大全电视剧 | 精品国产AⅤ一区二区三区| 亚洲成AV成人片在线观看| 极品粉嫩国产18尤物在线观看| 亚洲精品成人久久久| 久久精品国产亚洲AV麻豆色欲| 亚洲中文精品久久久久久不卡| 国产毛片毛多水多的特级毛片| 无码精品人妻一区二区三区人妻斩| 国产成人无码AⅤ片在线观看你 | 儿子比老公更大更硬朗| 色欲香天天天综合网站| 多毛BGMBGMBGM胖在线| 天天摸日日摸狠狠添高潮喷| 国产成人综合精品无码| 亚洲AV无码成人精品区欧洲| 精品国产成人一区二区| 亚洲熟妇一区二区| 国产裸模视频免费区无码 | 日本无人区一线影视| 关灯后在线高清免费观看| 亚洲AⅤ日韩AV电影在线观看| 狠狠色伊人亚洲综合网站野外| 亚洲色大成网站WWW看下面| 久久久久久久女国产乱让韩| 中文字幕无码专区人妻制服| 精品无码一区二区三区爱欲九九| 一区二区三区av在线| 欧美巨大XXXX做受高清| 粗大的内捧猛烈进出在线视频| 少妇性XXXXXXXXX色武功| 国产午夜三级一区二区三| 亚洲精品无码精品MV在线观看| 两个女人互添下身爽舒服小说| CHINESE熟女老女人HD视| 少妇特黄A一区二区三区| 国内毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 国产亚洲无线码一区二区| 亚洲熟妇XXXXX色黄妇| 女人两腿扒开图片大全| 大黑大巴大战欧洲美女图片| 无码性午夜视频在线观看| 精品无码人妻一区二区免费蜜桃 | 第一夜被弄得又红又肿| 亚洲AVAV黄网站| 乱人伦人妻中文字幕无码| 亚洲AⅤ永久无码精品毛片| 久久久WWW影院人成_免费| JIZZJIZZ日本护士水好多| 玩小雪跪趴把腿分到最大影视| 成人网站国产在线视频内射视频| 无码无套少妇毛多18PXXXX| 久久免费99精品国产自在现线| 被公疯狂进入的美丽人妻| 日本久久久久精品免费网播放| 国产情侣一区二区| 亚洲成AV人在线观看网址| 老狼一区忘忧草欢迎您大豆男男| 亚洲制服丝袜无码AV在线| 全免费A级毛片免费看网站| 国产精品成人免费视频网站| 一边下奶一边吃面膜视频讲解图片| 日本丰满熟妇BBxBB| 精品9E精品视频在线观看| 亚洲一区二区三区高清AV |