一個常見的閉包函式的分析
先看個程式碼:
//糟糕的例子
//構造一個函式,用錯誤的方式給一個陣列中的節點設定事件處理程式
//當點選一個節點時,按照預期,應該彈出一個對話方塊顯示節點的序號
//但它總是會顯示節點的數目
var add_the_handlers=function(nodes){
var i;
for(var i=0;i<nodes.length;i++){
nodes[i].onclick=function(e){
alert(i);
};
}
};
add_the_handlers函式的本意是想傳遞給每個事件處理器一個唯一值(i),但它未能達到目的,因為事件處理器函式繫結了變數i本身,而不是函式在構造時的變數i的值。
for迴圈有一個自己的小小作用域,每執行一次,只是將function賦給onclick事件,和函式內的內容無多大關係。最後點選時觸發執行,此時的i已經為4,所以全部為4.該處重點理解 將函式當成一個資料型別,每迴圈一次相當於賦與函式一次,並未執行
//改良後的例子
//構造一個函式,用正確的方式給一個陣列中的節點設定事件處理程式
//點選一個節點時,彈出一個對話方塊顯示節點的序號
var add_the_handlers=function(nodes){
var helper=function(i){
return function(e){
alert(i);
};
};
var i;
for(var i=0;i<nodes.length;i++){
nodes[i].onclick=helper(i);
}
};
總結:
避免在迴圈中建立函式,它可能只會帶來無謂的計算,還會引起混淆。
我們可以在迴圈之外創造一個輔助函式,讓這個輔助函式再返回一個繫結了當前i值的函式。
相關文章
- 閉包函式(匿名函式)的理解函式
- 函式閉包函式
- python語言幾個常見函式的使用Python函式
- go 閉包函式Go函式
- js函式閉包JS函式
- 回撥函式 與 函式閉包函式
- php常見的危險函式PHP函式
- Golang閉包案例分析與普通函式對比Golang函式
- js常見函式總結(一)JS函式
- 函式閉包機制函式
- 理解Python函式閉包Python函式
- JS函式表示式——函式遞迴、閉包JS函式遞迴
- 函式物件、裝飾器、閉包函式函式物件
- js中的函式巢狀和閉包JS函式巢狀
- 詳解常見的損失函式函式
- 常見函式之單行函式函式
- Python 閉包函式說明Python函式
- c++一些常見的內建函式(字串)C++函式字串
- 第一類物件(函式),閉包及迭代器物件函式
- rust十三.1、匿名函式(閉包)Rust函式
- 3. 匿名函式與閉包函式
- JavaScript4:函式和閉包JavaScript函式
- Python基礎之閉包函式Python函式
- 淺談匿名函式和閉包函式
- 立即執行函式(IIFE)&&閉包函式
- Go 函式的三種用法:方法、閉包、實參Go函式
- 閉包詳解二:JavaScript中的高階函式JavaScript函式
- python常見內建函式Python函式
- js中,函式的閉包、作用域跟[[Scopes]]的關係JS函式
- 個人python與dl學習常見常用函式Python函式
- 閉包函式,裝飾器詳解函式
- python 關於 函式物件與閉包Python函式物件
- 1.13 JavaScript4:函式和閉包JavaScript函式
- PHP新特性之閉包、匿名函式PHP函式
- 【SQL Server】常見系統函式SQLServer函式
- MySQL教程之常見函式(四)MySql函式
- JavaScript 五大常見函式JavaScript函式
- 使用python繪出常見函式Python函式
- C++常見函式的基礎演算法C++函式演算法