Tôi cố gắng sử dụng đoạn mã sau để đăng ký cuộc gọi lại trên một loạt nút. Nhưng tôi dường như không hiểu cách liên kết chuỗi cần thiết trong cuộc gọi lại. Mọi đề xuất sẽ được đánh giá rất cao!
for (var i = 0; i < this.car_types.length; ++i) {
this.select_car_buttons.push($("#button_select_car_" +
this.car_types[i].car_type));
this.select_car_buttons[this.select_car_buttons.length - 1]
.click(hàm() {
console.log(this.car_types[i].car_type);
}.bind(this));
}
Bằng cách nào đó,cái này
Đối tượng chính là nút chứ không phải đối tượng trong phạm vi mà hàm đang được gọi.
biên tập: dường như đang truyền vào đối tượng này một cách chính xác. Vấn đề là biến Tôi
Không nằm ngoài phạm vi, nhưng được ghi lại bằng tham chiếu thay vì giá trị. Tôi nên giải quyết vấn đề này như thế nào?
JavaScript với tư cách là một ngôn ngữ dường như cũng có rất nhiều vấn đề như vậy (ít nhất có thể được phân loại là một vấn đề dựa trên ngữ nghĩa được áp dụng bởi các ngôn ngữ họ C truyền thống như C và C++), có một số vấn đề tôi có thể đọc về không. Bài báo cảnh báo tôi chống lại những loại vấn đề này?
CHỈNH SỬA KHÁC :Trong khi cố gắng sử dụng tính năng ghi lại giá trị Tôi
Khi đóng giá trị, tôi đã thử đoạn mã sau
this.select_car_buttons[this.select_car_buttons.length - 1]
.click((hàm(scoped_i) {
hàm trả về() {
console.log(this.car_types[scoped_i].car_type);
}.bind(cái này);
}(Tôi)));
Nhưng tôi gặp lỗi sau trong Safari
TypeError: không xác định không phải là một đối tượng (đánh giá 'scoped_i')
biên tập:Mã tương tự hoạt động trong Firefox và Chrome, nhưng không hoạt động trong Safari!
Đây là một vấn đề phạm vi. Đối với các trình duyệt hiện đại (Hỗ trợ ES6), bạn chỉ cần for
Trung tướng của chu kỳ var
Thay đổi thành cho phép
có thể được sửa chữa.
for (let i = 0; i < this.car_types.length; ++i)
Trích dẫntài liệu MDN
các cho phép câu lệnh khai báo một biến cục bộ trong phạm vi khối, tùy ý khởi tạo nó thành một giá trị.
Để được hỗ trợ toàn cầu hơn (Hỗ trợ không phải ES6), hãy sử dụng hàm được gọi ngay lập tức để tạo thêm phạm vi cho biến (Bạn chuyển nó dưới dạng tham số)
this.select_car_buttons[this.select_car_buttons.length - 1]
.click((function(scoped_i) { // IIF bắt đầu từ đây, biến mới được gọi làscoped_i để thể hiện mức độ chi tiết
return function() { // mã hàm ban đầu của bạn ở đây
console.log(this.car_types[scoped_i].car_type); // sử dụng biến mới được xác định phạm vi
}.bind(cái này);
}.bind(this)(i))); // kết thúc và thực thi IIF trong khi truyền biến i cho nó
Tôi là một lập trình viên xuất sắc, rất giỏi!