在另一個StackOverflow問題(Creating a clickable grid in a web browser)中,回答者發佈了此示例:http://jsfiddle.net/6qkdP/2/。幫助理解函數回調
我正在嘗試在學習JavaScript時做類似的事情,但這個答案提供了比答案更多的問題。現在,我想我理解返回函數的函數的概念。然而,JS張貼的jsfiddle鏈路上混淆了我,這裏的原因......
第15行,創建功能:
function clickableGrid(rows, cols, callback){...}
看似簡單:通過行和列數,並傳遞任何被調用的函數(對吧?)。在第2行中,它調用該函數,對於回調函數,它傳遞一個接受一些東西(el,row,col,i)的函數並在控制檯中提供輸出。
var grid = clickableGrid(10,10,function(el,row,col,i){...}
這一切似乎很容易理解(當然,假設我理解正確!)。但是,然後從24行開始的這個位讓我感到困惑:
它爲正在創建的元素創建一個click事件偵聽器。此事件監聽器調用接受4個參數的新函數... cell.addEventListener('click',(function(el,r,c,i)){
...返回另一個函數...
return function(){
...這是主要功能的回調,路過那些相同的4個參數(?)...
callback(el,r,c,i);
}
...然後,該位是在點擊期間所獲取傳遞事件?
})(cell,r,c,i),false);
是嗎?這一切似乎對我來說過分困惑......例如,我不明白爲什麼創建一個接受相同參數的函數,並在不需要所有這些回調的情況下立即改變元素的樣式?我錯過了一些東西,並希望這裏更有經驗的人可以提供關於我沒有掌握的東西的信息。
謝謝!
代碼,萬一的jsfiddle下跌:
var lastClicked;
var grid = clickableGrid(10,10,function(el,row,col,i){
console.log("You clicked on element:",el);
console.log("You clicked on row:",row);
console.log("You clicked on col:",col);
console.log("You clicked on item #:",i);
el.className='clicked';
if (lastClicked) lastClicked.className='';
lastClicked = el;
});
document.body.appendChild(grid);
function clickableGrid(rows, cols, callback){
var i=0;
var grid = document.createElement('table');
grid.className = 'grid';
for (var r=0;r<rows;++r){
var tr = grid.appendChild(document.createElement('tr'));
for (var c=0;c<cols;++c){
var cell = tr.appendChild(document.createElement('td'));
cell.innerHTML = ++i;
cell.addEventListener('click',(function(el,r,c,i){
return function(){
callback(el,r,c,i);
}
})(cell,r,c,i),false);
}
}
return grid;
}