今天在做一个动态循环添加行,并在新行添加onclick事件,调用一个带参数的函数时,遇到一个问题,当行添加完成后,行上的onclick事件触发时,传入的参数总是循环里最后一行传过来的参数,现将错误的写法和正确的写法记录如下:
错误的写法:
var displaySelectResult = function(str) {
alert(str);
}
if ('' != search_result) {
for (var i = 0; i < search_result.length; i++) {
var newTR = search_table_results.insertRow();
var newTD = newTR.insertCell();
newTD.innerText = search_result[i];
newTD.attachEvent("onclick", function() {
displaySelectResult(newTD.innerText);
});
}
}
这种写法得到的结果是,添加的所有新行的onclick事件调用时,总是alert出来search_result[最后一个索引]的值,不能正确地把循环中的每一个索引相应的传给每次添加的行
正确的写法则应如下:
if ('' != search_result) {
for (var i = 0; i < search_result.length; i++) {
var newTR = search_table_results.insertRow();
var newTD = newTR.insertCell();
newTD.innerText = search_result[i];
newTD.onclick = function (str) {
return function() {
alert(str);
};
}(search_result[i]);
}
}
这就是javascript中相关的闭包的概念范围.