一個常見的閉包函式的分析
先看個程式碼:
//糟糕的例子
//構造一個函式,用錯誤的方式給一個陣列中的節點設定事件處理程式
//當點選一個節點時,按照預期,應該彈出一個對話方塊顯示節點的序號
//但它總是會顯示節點的數目
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函式
- js函式 函式自呼叫 返回函式的函式 (閉包)JS函式
- go 閉包函式Go函式
- js函式閉包JS函式
- 回撥函式 與 函式閉包函式
- python語言幾個常見函式的使用Python函式
- js常見函式總結(一)JS函式
- php常見的危險函式PHP函式
- Golang閉包案例分析與普通函式對比Golang函式
- JS閉包函式概念JS函式
- JavaScript 匿名函式 閉包JavaScript函式
- JS函式表示式——函式遞迴、閉包JS函式遞迴
- JS閉包函式和回撥函式JS函式
- JavaScript進階系列01,函式的宣告,函式引數,函式閉包JavaScript函式
- 學習一下閉包函式 - Closures函式
- 常見函式之單行函式函式
- js中的函式巢狀和閉包JS函式巢狀
- 詳解常見的損失函式函式
- 理解Python函式閉包Python函式
- c++一些常見的內建函式(字串)C++函式字串
- 第一類物件(函式),閉包及迭代器物件函式
- 淺談C#的函式建立和閉包C#函式
- 日期函式以及常見的日期表達函式
- Python 閉包函式說明Python函式
- JavaScript4:函式和閉包JavaScript函式
- 3. 匿名函式與閉包函式
- 淺談匿名函式和閉包函式
- 立即執行函式(IIFE)&&閉包函式
- PHP閉包函式使用詳解PHP函式
- Oracle常見數字函式Oracle函式
- Go 函式的三種用法:方法、閉包、實參Go函式
- 閉包詳解二:JavaScript中的高階函式JavaScript函式
- 常見的不不能宣告為虛擬函式函式