2013-06-16 36 views
6

Tôi có một hàm trong javascriptràng buộc một chức năng để chức năng khác trong javascript

function foo(callback) { 
    console.log("Hello"); 
    callback(); 
} 

và một chức năng

function bar() { 
    console.log("world"); 
} 

và tôi muốn thực hiện một chức năng FooBar

FooBar = foo.bind(this, bar); 

này hoạt động tốt, tuy nhiên những gì tôi thực sự cố gắng làm là tạo ra một function queue và en tôi sẽ phải gắn một tham số chức năng không trước khi ràng buộc một callback, như trong ví dụ sau

function foo() { 
    console.log(arguments[0]); 
    var func = arguments[1]; 
    func(); 
} 

function bar() { 
    console.log("world"); 
} 

foo.bind(this, "hello"); 
var FooBar = foo.bind(this, bar); 

FooBar(); 

trong đó sản xuất lỗi này

[Function: bar] 

TypeError: undefined is not a function 

Làm thế nào có thể một Tôi gắn một chức năng khác chức năng khi nó đã bị ràng buộc với các loại hàm khác không?

Trả lời

5

Bạn đang ràng buộc "Hello"-foo, và sau đó riêng ràng buộc bar-foo cũng - không nên bạn ràng buộc bar đến kết quả của bind đầu tiên, như thế này:

var FooHello = foo.bind(this, "hello"); 
var FooBar = FooHello.bind(this, bar); 

Fiddle here. (mà đăng nhập "Chào thế giới").

+0

Để biết ví dụ ít phức tạp hơn, hãy xem http://jsfiddle.net/XM4kQ/8/. và đọc lên trên ràng buộc ở đây https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind như ví dụ này fiddle liên kết để làm cho nó trông giống như bạn đang thực sự ràng buộc thanh để một ràng buộc của foo ... – mschuett

4

Phương thức liên kết không liên kết các hàm với nhau, mục đích của nó là sửa ngữ cảnh của từ khóa 'this' và bất kỳ đối số nào khi hàm được gọi. Sau đó nó trả về một hàm mới, để nguyên bản gốc.

Vì vậy: foo.bind(this, "hello") thực sự không có hiệu lực. Việc kết nối cuộc gọi thứ hai sẽ tạo ra một hàm mới với đối số cố định là bar. Lý do bạn gặp lỗi là vì chỉ có một đối số được chuyển, arguments[1] không được xác định.

Bạn có thể làm như Richie gợi ý và thêm một biến trung gian, hoặc chỉ cần vượt qua cả đối số trong một ràng buộc duy nhất:

var FooBar = foo.bind(this, "hello", bar); 

Nó có lẽ là một ý tưởng tốt để cũng bao gồm thời gian chạy kiểm tra để chức năng của bạn có thể phát hiện khi nó đang xử lý một hàm. Điều này sẽ giúp bạn tiết kiệm phải lo lắng về thứ tự đối số.

if(typeof func === 'function'){ 
    func(); 
} 
Các vấn đề liên quan