Có hai vấn đề ở đó, một vấn đề mà JSHint đang cảnh báo bạn và một điều cơ bản hơn.
Điều JSHint cảnh báo bạn về lý thuyết là mỗi lần vòng lặp đó chạy, một hàm mới được tạo. Đây sẽ là tốt hơn:
for (var person in people) {
person.forEach(handlePerson);
}
function handlePerson(item) {
console.log(item)
}
tôi nói "về mặt lý thuyết" vì mặc dù spec đòi hỏi một đối tượng hàm mới được tạo ra mỗi lần, điều đó không có nghĩa là động cơ không thể tái sử dụng cơ bản thực hiện của hàm, và nó không có nghĩa là các công cụ không thể tái sử dụng cùng một đối tượng hàm nếu bạn không gán bất kỳ thuộc tính nào khác cho nó hoặc giữ một tham chiếu đến nó. Tôi asked the V8 guys about it (V8 là công cụ JavaScript trong Chrome) và họ nói rằng Chrome sẽ "... trong hầu hết các trường hợp ..." sử dụng lại chức năng triển khai chức năng cơ bản cho các đối tượng chức năng khác nhau được tạo tại cùng một điểm trong mã nguồn và họ sẽ "mong đợi" rằng hầu hết các động cơ khác sẽ làm như vậy.
Vì vậy, JSHint có thể là một chút over-the-top trong trường hợp cụ thể này. Nhưng nó thường là một cảnh báo hữu ích, đặc biệt nếu các hàm bạn đang tạo bên trong vòng lặp tham chiếu đến các biến có nội dung thay đổi trong vòng lặp, đó là lỗi đóng cửa cổ điển mà mọi người thực hiện.
Nhưng về cơ bản hơn, person
là một String
(đó là tên của một tài sản trong people
), và String
không có forEach
. Bạn muốn:
for (var person in people) {
people[person].forEach(handlePerson);
}
function handlePerson(item) {
console.log(item)
}
... ví dụ: people[person]
để lấy mảng cho khóa đó.
Nguồn
2012-05-04 15:35:53
Tôi đoán anh ấy có nghĩa là 'người [người] .forEach (...) '. Dù sao, cảnh báo đó dường như khá ngu ngốc với các công cụ JS hiện đại - chúng có nhiều khả năng sẽ không tạo ra một chức năng mới cho mỗi lần lặp lại. – ThiefMaster
Ít nhất V8 không: http://stackoverflow.com/questions/10160275/v8-internals-handling-of-anonymous-functions – ThiefMaster
'người' là một đối tượng (chứa mảng). –