首頁 web前端 js教程 淺談js中的閉包_javascript技巧

淺談js中的閉包_javascript技巧

May 16, 2016 pm 04:09 PM
js 閉包

首先我們先來看一段程式碼:

複製程式碼 程式碼如下:

111
222
333
var a=document.getElementsByTagName("a");
  function b(){
    for(var i=0;i     a[i].onclick=function(){
      alert(i);
    }  
  }
}

  按照我們設計的初衷,應該是點擊一個a標籤就相應的彈出該標籤的序號,即點擊第一個a就彈出0,點擊第二個就彈出1...但是事實是彈出的始終是a標籤的個數,這是什麼原因呢?這個問題困擾了我很久,查閱了許多網路上的資料還有參考書籍,大多說的似是而非,相信也有許多同學對其中原因也不甚了解,就這個問題我談談自己的理解,如有不當之處,還請批評指正。

  就我個人的理解,上述函數未能達到目的的原因是,事件處理函數綁定了變數i,而該事件處理函數又賦值給了onclick,即是說只有在點擊a標籤的時候才會呼叫該函數,因此從邏輯上來說,在單純的for迴圈裡面function(){alert(i);}這段函數其實是沒有執行的,而當我們點擊a標籤的時候for迴圈早就已經執行完畢,此時i的值就是for迴圈執行完畢的終態值。通俗一點理解,就是這個i的值是屬於b函數的,而我們需要的i的值是即時傳遞進事件處理函數中的值。那麼有什麼方法可以實現我們的設計初衷呢?聰明的同學可能已經猜到了,那就是使用閉包。

下面我們再來看一段程式碼:

複製程式碼 程式碼如下:

var a=document.getElementsByTagName("a");
  function b(){
    for(var i=0;i       a[i].onclick=function(j){
        return function(){
        alert(j);
      }
    }(i);
  }
}
b();

  執行以上程式碼可以發現,我們所要的功能已經實現,即點擊任意a標籤都會彈出該標籤所在的序號。對上述程式碼,相信許多同學都看過許多雷同的版本,但是為什麼這樣做就能實現我們需要的功能了呢,一下是個人的一點淺見,如有不當,還請不吝賜教。

  對上述程式碼的理解,其本質就是對變數i的理解。在這段程式碼中,函數執行到for迴圈處發現了一個立即呼叫函數,這個時候給這個立即呼叫函數傳遞即時的i變數值,函數立即呼叫完成,事件處理函數也就儲存了即時的i變數值。

以上所述就是本文的全部內容了,希望對大家理解js閉包能夠有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

建議:優秀JS開源人臉偵測辨識項目 建議:優秀JS開源人臉偵測辨識項目 Apr 03, 2024 am 11:55 AM

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

C++ lambda 表達式中閉包的意思是什麼? C++ lambda 表達式中閉包的意思是什麼? Apr 17, 2024 pm 06:15 PM

在C++中,閉包是能夠存取外部變數的lambda表達式。若要建立閉包,請擷取lambda表達式中的外部變數。閉包提供可重複使用性、資訊隱藏和延遲求值等優點。它們在事件處理程序等實際情況中很有用,其中即使外部變數被銷毀,閉包仍然可以存取它們。

C++ Lambda 表達式如何實作閉包? C++ Lambda 表達式如何實作閉包? Jun 01, 2024 pm 05:50 PM

C++Lambda表達式支援閉包,即保存函數作用域變數並供函數存取。語法為[capture-list](parameters)->return-type{function-body}。 capture-list定義要捕獲的變量,可以使用[=]按值捕獲所有局部變量,[&]按引用捕獲所有局部變量,或[variable1,variable2,...]捕獲特定變量。 Lambda表達式只能存取捕獲的變量,但無法修改原始值。

C++ 函式中閉包的優點和缺點是什麼? C++ 函式中閉包的優點和缺點是什麼? Apr 25, 2024 pm 01:33 PM

閉包是一種巢狀函數,它能存取外層函數作用域的變量,優點包括資料封裝、狀態保持和靈活性。缺點包括記憶體消耗、效能影響和調試複雜性。此外,閉包還可以建立匿名函數,並將其作為回調或參數傳遞給其他函數。

解決閉包導致的記憶體洩漏問題 解決閉包導致的記憶體洩漏問題 Feb 18, 2024 pm 03:20 PM

標題:閉包造成的記憶體洩漏及解決方法引言:閉包是JavaScript中一個非常常見的概念,它可以讓內部函數存取外部函數的變數。然而,閉包在使用不當的情況下可能導致記憶體洩漏。本文將探討閉包所造成的記憶體洩漏問題,並提供解決方法及具體程式碼範例。一、閉包引起的記憶體洩漏問題閉包的特性是內部函數可以存取外部函數的變量,這意味著在閉包中引用的變數不會被垃圾回收。如果使用不當,

函數指標和閉包對Golang效能的影響 函數指標和閉包對Golang效能的影響 Apr 15, 2024 am 10:36 AM

函數指針和閉包對Go性能的影響如下:函數指針:稍慢於直接調用,但可提高可讀性和可復用性。閉包:通常更慢,但可封裝資料和行為。實戰案例:函數指標可最佳化排序演算法,閉包可建立事件處理程序,但會帶來效能損失。

js和vue的關係 js和vue的關係 Mar 11, 2024 pm 05:21 PM

js和vue的關係:1、JS作為Web開發基石;2、Vue.js作為前端框架的崛起;3、JS與Vue的互補關係;4、JS與Vue的實踐應用。

PHP 函數的鍊式呼叫與閉包 PHP 函數的鍊式呼叫與閉包 Apr 13, 2024 am 11:18 AM

是的,可以透過鍊式呼叫和閉包優化程式碼簡潔性和可讀性:鍊式呼叫可將函數呼叫連結為一個流暢介面。閉包可建立可重複使用程式碼區塊,並在函數外部存取變數。

See all articles