2012-01-18 31 views
36

Tôi đang tạo hàm lambda thực hiện hàm thứ hai với tham số cụ thể. Mã này hoạt động trong Firefox nhưng không có trong Chrome, trình kiểm tra của nó hiển thị lỗi lạ, Uncaught TypeError: Illegal invocation. Có gì sai mã của tôi?Uncaught TypeError: Gọi bất hợp pháp trong javascript

var make = function(callback,params){ 
    callback(params); 
} 

make(console.log,'it will be accepted!'); 
+1

nếu tôi thay thế 'console.log' bằng' console.log.bind (console) ', nó hoạt động trong Chrome 12. –

+2

@ DanD — chỉ ra rằng * log * dự kiến ​​được gọi là phương thức * console *, tức là từ khóa * this * của nó phải tham chiếu đến đối tượng * console *. – RobG

+0

Hàm 'make' của bạn tương đương với' callback.call (null, params) ' –

Trả lời

63

Chức năng nhật ký của bảng điều khiển mong đợi this để tham khảo bảng điều khiển (nội bộ). Hãy xem xét mã này mà tái tạo vấn đề của bạn:

var x = {}; 
x.func = function(){ 
    if(this !== x){ 
     throw new TypeError('Illegal invocation'); 
    } 
    console.log('Hi!'); 
}; 
// Works! 
x.func(); 

var y = x.func; 

// Throws error 
y(); 

Đây là một (ngớ ngẩn) ví dụ mà sẽ làm việc, kể từ khi nó liên kết this để console trong thực hiện chức năng của bạn:

var make = function(callback,params){ 
    callback.call(console, params); 
} 

make(console.log,'it will be accepted!'); 

này cũng sẽ làm việc

var make = function(callback,params){ 
    callback(params); 
} 

make(console.log.bind(console),'it will be accepted!'); 
+0

Giải thích rõ ràng –

4

Bạn có thể bọc hàm cần 'this' vào hàm lambda mới, sau đó sử dụng hàm này cho hàm gọi lại của bạn.

function make(callback, params) { 
    callback(params); 
} 

make(function(str){ console.log(str); }, 'it will be accepted!'); 
Các vấn đề liên quan