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

輕松理解JavaScript閉包

 更新時間:2017年03月14日 11:41:54   作者:嶸么么  
閉包機制是JavaScript的重點和難點,本文希望能幫助大家輕松的學習閉包。下面跟著小編一起來看下吧

摘要

閉包機制是JavaScript的重點和難點,本文希望能幫助大家輕松的學習閉包

一、什么是閉包?

閉包就是可以訪問另一個函數(shù)作用域中變量的函數(shù)。

下面列舉出常見的閉包實現(xiàn)方式,以例子講解閉包概念

function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000

f1是f2的父函數(shù),而f2被賦給了一個全局變量(return的值),這導致f2始終在內存中,而f2的存在依賴于f1,因此f1也始終在內存中,不會在調用結束后,被垃圾回收機制(garbage collection)回收,這便形成了閉包。

因此,可以這么理解。閉包機制就是,如果A函數(shù)引用了另一個函數(shù)B的變量,但是B返回后A仍沒有返回,仍存在,因為A的引用,所以B的所有局部變量并不會隨B退出而注銷,會一直存在,直到A注銷。此時A就是閉包。

二、閉包的this指針

閉包通常在全局環(huán)境調用的,所以this通常指向window,具體情況還是需要視執(zhí)行環(huán)境而言,總之this指向執(zhí)行環(huán)境。

若需要閉包的this指向閉包的包含對象,則需要將包含對象的this作為變量傳進閉包。

三、使用閉包的注意點

  1. 由于閉包會使得函數(shù)中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。
  2. 閉包會在父函數(shù)外部,改變父函數(shù)內部變量的值。所以,如果你把父函數(shù)當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數(shù)內部變量的值。

四、解決一道閉包常見面試題

問題:

function onMyLoad(){
  /*
  拋出問題:
  此題的目的是想每次點擊對應目標時彈出對應的數(shù)字下標 0~4,但實際是無論點擊哪個目標都會彈出數(shù)字5
  問題所在:
  arr 中的每一項的 onclick 均為一個函數(shù)實例(Function 對象),這個函數(shù)實例也產(chǎn)生了一個閉包域,
  這個閉包域引用了外部閉包域的變量,其 function scope 的 closure 對象有個名為 i 的引用,
  外部閉包域的私有變量內容發(fā)生變化,內部閉包域得到的值自然會發(fā)生改變
  */
  var arr = document.getElementsByTagName("p");
  for(var i = 0; i < arr.length;i++){
  arr[i].onclick = function(){
   alert(i);
  }
  }
 }

解決方法

1、在外面再加一層函數(shù),將i作為函數(shù)參數(shù)傳進來,這樣每次保存的是函數(shù)內部的變量,與外部i不是同一個內存空間,而每次調用函數(shù)都會生成一個局部變量,所以可以保證每次保存的值互不影響。

for(var i = 0; i<arr.length;i++){
 arr[i].onclick = (function(arg){
  return function () {
   alert(arg);
  }
 })(i);
}

2、用ES6新特let,將for循環(huán)的var i改成let i,這樣當前的i只在本輪循環(huán)有效,所以每一次循環(huán)的i其實都是一個新的變量。你可能會問,如果每一輪循環(huán)的變量i都是重新聲明的,那它怎么知道上一輪循環(huán)的值,從而計算出本輪循環(huán)的值?這是因為 JavaScript 引擎內部會記住上一輪循環(huán)的值,初始化本輪的變量i時,就在上一輪循環(huán)的基礎上進行計算。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關文章

  • 淺析ES6與CommonJS中模塊的用法對比

    淺析ES6與CommonJS中模塊的用法對比

    ES6?的模塊化汲取了?CommonJS?和AMD?的優(yōu)點,擁有簡潔的語法和異步的支持,并且寫法也和?CommonJS?非常的相似,下面我們就來看看二者用法的差異吧
    2023-09-09
  • JS利用時間戳倒計時的實現(xiàn)示例

    JS利用時間戳倒計時的實現(xiàn)示例

    這篇文章主要介紹了JS利用時間戳倒計時的實現(xiàn)示例,本文將提供代碼示例和詳細的步驟,幫助你實現(xiàn)一個簡單而實用的時間戳倒計時,感興趣的可以了解一下
    2023-12-12
  • 利用JavaScript實現(xiàn)簡單的網(wǎng)頁時鐘

    利用JavaScript實現(xiàn)簡單的網(wǎng)頁時鐘

    這篇文章主要介紹了利用JavaScript實現(xiàn)簡單的網(wǎng)頁時鐘,主要使用了js的日期對象,實現(xiàn)的時候先創(chuàng)建一個日期對象,并進行網(wǎng)頁布局,對時間獲取之后將時間填入對應的標簽內。然后使用多線程實現(xiàn)時鐘的變動,需要的朋友可以參考一下
    2022-02-02
  • 關于laydate.js加載laydate.css路徑錯誤問題解決

    關于laydate.js加載laydate.css路徑錯誤問題解決

    日期時間選擇插件 laydate.js相信對大家來說都不陌生,這篇文章主要給大家介紹了關于laydate.js加載laydate.css路徑錯誤問題解決的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-12-12
  • 原生JS實現(xiàn)點擊數(shù)字小游戲

    原生JS實現(xiàn)點擊數(shù)字小游戲

    這篇文章主要為大家詳細介紹了原生JS實現(xiàn)點擊數(shù)字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • js自定義事件代碼說明

    js自定義事件代碼說明

    在研發(fā)公展公用后臺的時候,用了許多的技巧性的JS,最有代表性就是如下這一例子.
    2011-01-01
  • JSON 對象未定義錯誤的解決方法

    JSON 對象未定義錯誤的解決方法

    下面小編就為大家?guī)硪黄狫SON 對象未定義錯誤的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • 移動端網(wǎng)頁開發(fā)調試神器Eruda的介紹與使用技巧

    移動端網(wǎng)頁開發(fā)調試神器Eruda的介紹與使用技巧

    在日常的移動端開發(fā)時,一般都是試用chrome瀏覽器的移動端模式進行開發(fā)和調試,只有在chrome調試完成,而最近發(fā)現(xiàn)了一個新的調試方法,所以這篇文章主要給大家介紹了關于移動端網(wǎng)頁開發(fā)調試神器Eruda的基本資料,以及其使用的一些技巧,需要的朋友可以參考下。
    2017-10-10
  • openlayers4實現(xiàn)點動態(tài)擴散

    openlayers4實現(xiàn)點動態(tài)擴散

    這篇文章主要為大家詳細介紹了openlayers4實現(xiàn)的點動態(tài)擴散,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 對 lightbox JS 圖片控件進行了一下改造, 使其他支持復雜的圖片說明

    對 lightbox JS 圖片控件進行了一下改造, 使其他支持復雜的圖片說明

    如果要為圖片添加詳細的圖片說明,并為圖片的說明設置一些格式,如字體的大小、顏色等,那么使用 title 這個屬性來設置這些說明信息是沒辦法實現(xiàn)的。
    2010-03-03

最新評論

高邑县| 巨野县| 荥经县| 衡阳县| 新乡市| 金川县| 冀州市| 苍梧县| 德格县| 平塘县| 商南县| 那曲县| 崇文区| 阿拉尔市| 平凉市| 抚松县| 德清县| 林州市| 射阳县| 墨江| 丰原市| 高碑店市| 丰镇市| 策勒县| 饶平县| 突泉县| 民县| 禄丰县| 五指山市| 广东省| 定安县| 万盛区| 英吉沙县| 分宜县| 大理市| 绿春县| 顺平县| 靖江市| 嵊州市| 马鞍山市| 苏州市|