Nói chung, bạn không thể chuyển trực tiếp phương thức đến các cuộc gọi lại trong Javascript. Các this
là ràng buộc tại thời điểm cuộc gọi chức năng, tùy thuộc vào những gì hình thức bạn gọi nó và không có tự động ràng buộc của phương pháp (như có, ví dụ, Python)
//does not work.
var obj = {
x: 17,
f: function(){ return this.x; }
};
//inside doSomething, f forgets its "this" should be obj
doSomething(obj.f)
Trong những trường hợp này, người ta có thể sử dụng Function.prototype.bind
(hoặc một chức năng tương tự từ thư viện của bạn lựa chọn, vì bind
là không có mặt trong IE < = 8)
//works (for normal methods - see next bit for console.log in particular)
var obj = {
x: 17,
f: function(){ return this.x; }
};
doSomething(obj.f.bind(obj))
Thật không may, tuy nhiên, điều này không phải lúc nào đủ cho console.log. Vì nó không phải là một chức năng thực tế trong IE, (nó là một đối tượng host độc ác), bạn không thể sử dụng bind, apply và gọi phương thức trên nó trên trình duyệt đó để giải pháp duy nhất đang rơi trở lại gói gọi trong một hàm ẩn danh
doSomething(function(x){
return console.log(x);
});
Vì gói bảng điều khiển.đăng nhập vào một chức năng ẩn danh dài và gây phiền nhiễu đối với loại Tôi thường thêm chức năng toàn cục sau khi tôi đang phát triển và gỡ lỗi:
function log(message){ return function(x){
return console.log(message, x);
};};
forEach(['asd', 'zxc'], log('->'));
Nó sẽ hoạt động nếu bạn chỉ chuyển 'bàn điều khiển' và gọi' nhật ký' bên trong chức năng forEach. –