Tôi đang đọc "Javascript: The Good Parts" và hoàn toàn bị bối rối bởi những gì thực sự xảy ra ở đây. Một lời giải thích chi tiết hơn và/hoặc đơn giản hơn sẽ được đánh giá cao.Đóng cửa: Giải thích từng dòng về ví dụ "Javascript: Good Parts"?
// BAD EXAMPLE
// Make a function that assigns event handler functions to an array of nodes the wrong way.
// When you click on a node, an alert box is supposed to display the ordinal of the node.
// But it always displays the number of nodes instead.
var add_the_handlers = function (nodes) {
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = function (e) {
alert(i);
}
}
};
// END BAD EXAMPLE
Chức năng add_the_handlers
nhằm cung cấp cho mỗi trình xử lý một số duy nhất (i). Nó không thành công bởi vì các chức năng xử lý chắc chắn sẽ biến i
, không phải là giá trị của biến i
lúc các chức năng đã được thực hiện:
// BETTER EXAMPLE
// Make a function that assigns event handler functions to an array of nodes the right way.
// When you click on a node, an alert box will display the ordinal of the node.
var add_the_handlers = function (nodes) {
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = function (i) {
return function (e) {
alert(i);
};
}(i);
}
};
Bây giờ, thay vì gán một chức năng để onclick, chúng ta định nghĩa một hàm và ngay lập tức gọi nó, đi qua số i
. Hàm đó sẽ trả về một hàm xử lý sự kiện được gắn với giá trị i
đã được chuyển vào, không phải là i
được định nghĩa trong add_the_handlers
. Hàm trả về đó được gán cho onclick.
Xem câu hỏi được gắn thẻ trong: http://stackoverflow.com/questions/tagged/javascript+closures+loops – CMS
Bạn cũng có thể chơi xung quanh với bản trình diễn trực tiếp http://jsbin.com/sezisalulede/1/edit?html,js,output –