最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js閉包學(xué)習(xí)心得總結(jié)

 更新時(shí)間:2018年04月17日 08:51:50   投稿:laozhang  
這篇文章主要介紹了JS閉包的學(xué)習(xí)心得,以及分析其中遇到的問(wèn)題,需要的朋友跟著參考下吧。

首先引用來(lái)自官網(wǎng)文檔的定義:

closure is the combination of a function and the lexical environment within which that function was declared.

閉包是一個(gè)函數(shù)和其內(nèi)部公開(kāi)變量的環(huán)境的集合.

簡(jiǎn)單而言, 閉包 = 函數(shù) + 環(huán)境

第一個(gè)閉包的例子

function init() {
 var name = 'Mozilla'; // name is a local variable created by init
 function displayName() { // displayName() is the inner function, a closure
 alert(name); // use variable declared in the parent function 
 }
 displayName(); 
}
init();

because inner functions have access to the variables of outer functions, displayName() can access the variable name declared in the parent function, init().

其實(shí)這個(gè)栗子很簡(jiǎn)單,displayName()就是init()內(nèi)部的閉包函數(shù),而為啥在displayName內(nèi)部可以調(diào)用到外部定義的變量 name 呢,因?yàn)閖s內(nèi)部函數(shù)有獲取外部函數(shù)中變量的權(quán)限。

第二個(gè)例子

var data = [
 {'key':0},
 {'key':1},
 {'key':2}
];
function showKey() {
 for(var i=0;i<data.length;i++) {
   setTimeout(function(){
    //console.log(i); //發(fā)現(xiàn)i輸出了3次3
   //console.log(this); // 發(fā)現(xiàn) this 指向的是 Window
   data[i].key = data[i].key + 10;
   console.log(data[i].key)
   }, 1000);
 }
}
showKey();

上面這個(gè)例子可以正確輸出 10 11 12 嗎?

答案是:并不能,并且還會(huì)報(bào)語(yǔ)法錯(cuò)誤....

console.log(i); 發(fā)現(xiàn)i輸出了3次3,也就是說(shuō),在setTimeout 1000毫秒之后,執(zhí)行閉包函數(shù)的時(shí)候,for循環(huán)已經(jīng)執(zhí)行結(jié)束了,i是固定值,并沒(méi)有實(shí)現(xiàn)我們期望的效果。

console.log(this); 發(fā)現(xiàn) this 指向的是 Window,也就是說(shuō),在函數(shù)內(nèi)部實(shí)現(xiàn)的閉包函數(shù)已經(jīng)被轉(zhuǎn)變成了全局函數(shù),存儲(chǔ)到了內(nèi)存中。

所以需要再定義一個(gè)執(zhí)行函數(shù)

var data = [
 {'key':0},
 {'key':1},
 {'key':2}
];
function showKey() {
 var f1 = function(n){
  data[i].key = data[i].key + 10;
  console.log(data[i].key)
 }
 for(var i=0;i<data.length;i++) {
   setTimeout(f1(i), 1000);
 }
}
showKey();
// 得到預(yù)期的 10 11 12

相關(guān)文章

  • js?剪切、復(fù)制、粘貼功能實(shí)現(xiàn)

    js?剪切、復(fù)制、粘貼功能實(shí)現(xiàn)

    Navigator.clipboard?API可以用來(lái)訪問(wèn)系統(tǒng)剪貼板,可以實(shí)現(xiàn)【剪切、復(fù)制、粘貼】功能。該?API?被設(shè)計(jì)用來(lái)取代使用?document.execCommand()?的剪貼板訪問(wèn)方式,不兼容?IE
    2023-05-05
  • 微信小程序異步API為Promise簡(jiǎn)化異步編程的操作方法

    微信小程序異步API為Promise簡(jiǎn)化異步編程的操作方法

    把微信小程序異步API轉(zhuǎn)化為Promise。用Promise處理異步操作很方便。下面小編給大家?guī)?lái)了微信小程序異步API為Promise簡(jiǎn)化異步編程的操作方法,感興趣的朋友一起看看吧
    2018-08-08
  • javascript中DOM復(fù)選框選擇用法實(shí)例

    javascript中DOM復(fù)選框選擇用法實(shí)例

    這篇文章主要介紹了javascript中DOM復(fù)選框選擇用法,實(shí)例分析了javascript操作復(fù)選框?qū)崿F(xiàn)全選與反選的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • javascript 中按屬性值查找數(shù)組中的對(duì)象多種方法

    javascript 中按屬性值查找數(shù)組中的對(duì)象多種方法

    JavaScript 數(shù)組可以保存混合類型的不同值,例如字符串、空值或布爾值,并且不需要數(shù)組的大小來(lái)指定它在哪里自動(dòng)增長(zhǎng)和動(dòng)態(tài),這篇文章主要介紹了javascript 中按屬性值查找數(shù)組中的對(duì)象多種方法,需要的朋友可以參考下
    2023-06-06
  • 微信小程序wxss如何引用外部CSS文件以及iconfont

    微信小程序wxss如何引用外部CSS文件以及iconfont

    這篇文章主要給大家介紹了關(guān)于微信小程序wxss如何引用外部CSS文件以及iconfont的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • JS實(shí)現(xiàn)json對(duì)象數(shù)組按對(duì)象屬性排序操作示例

    JS實(shí)現(xiàn)json對(duì)象數(shù)組按對(duì)象屬性排序操作示例

    這篇文章主要介紹了JS實(shí)現(xiàn)json對(duì)象數(shù)組按對(duì)象屬性排序操作,涉及javascript使用sort方法針對(duì)json數(shù)組的遍歷與排序相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-05-05
  • javascript一段創(chuàng)建層的代碼

    javascript一段創(chuàng)建層的代碼

    javascript一段創(chuàng)建層的代碼...
    2007-10-10
  • 禁止拷貝網(wǎng)頁(yè)內(nèi)容的js代碼

    禁止拷貝網(wǎng)頁(yè)內(nèi)容的js代碼

    如何禁止拷貝網(wǎng)頁(yè)內(nèi)容,想維護(hù)下自己的版權(quán),下面有個(gè)不錯(cuò)的方法,大家可以學(xué)習(xí)下
    2014-01-01
  • TypeError: Cannot set properties of undefined (setting ‘xx‘)的問(wèn)題及解決方法

    TypeError: Cannot set properties of 

    這篇文章主要介紹了TypeError: Cannot set properties of undefined (setting ‘xx‘)的問(wèn)題,本文給大家分享完美解決方案,需要的朋友可以參考下
    2023-09-09
  • 解決JS使用fill()進(jìn)行數(shù)組填充遇到的問(wèn)題

    解決JS使用fill()進(jìn)行數(shù)組填充遇到的問(wèn)題

    最近在做算法題時(shí),遇到需要?jiǎng)?chuàng)建二維數(shù)組并進(jìn)行初始化的情況,剛開(kāi)始我使用的是 new Array(n).fill(new Array(n).fill('.')) 進(jìn)行二維數(shù)組的初始化,但無(wú)論怎樣我都通不過(guò)測(cè)試用例,所以本文就給大家詳細(xì)的介紹了如何解決這類問(wèn)題以及將js中的fill(方法重學(xué)一下
    2023-09-09

最新評(píng)論

定边县| 鄂尔多斯市| 酉阳| 左贡县| 巧家县| 湖北省| 拉孜县| 营口市| 清河县| 横峰县| 漾濞| 浙江省| 藁城市| 阿拉善右旗| 汉沽区| 梅河口市| 凤城市| 正镶白旗| 上虞市| 古田县| 岱山县| 莱阳市| 龙岩市| 高淳县| 南雄市| 连城县| 商城县| 黔西县| 彭山县| 平塘县| 穆棱市| 昂仁县| 磐安县| 湾仔区| 菏泽市| 乌海市| 赫章县| 栾城县| 盖州市| 梧州市| 临夏市|