2013-03-28 31 views
32
var obj = { 
    x: 81, 
    getX: function() { 
    console.log(this.x) 
    } 
}; 
var getX = obj.getX.bind(obj);//use obj as 'this'; 
getX();//81 
var getX = function(){ 
    obj.getX.apply(obj); 
} 
getX();//also 81 

Việc sử dụng liên kết và gọi/áp dụng trông rất giống nhau, tôi muốn biết sự khác nhau giữa chúng. Hai hàm getX ở trên giống nhau không?Sự khác biệt giữa 'call/apply' và 'bind'

+0

Kiểm tra http://stackoverflow.com/questions/1986896/what-is-the-difference-between-call - và áp dụng hoặc http://stackoverflow.com/questions/15455009/js-call-apply-vs-bind – Rakesh

Trả lời

37

bind trả về một hàm sẽ hoạt động như chức năng ban đầu nhưng với this được xác định trước. Nó thường được sử dụng khi bạn muốn chuyển một hàm tới một trình xử lý sự kiện hoặc gọi lại không đồng bộ khác.

callapply sẽ gọi hàm ngay lập tức cho phép bạn chỉ định cả giá trị this và mọi đối số mà hàm sẽ nhận được.

Ví dụ thứ hai của bạn xác định hàm ẩn danh gọi apply. Đây là một mô hình phổ biến; bind cung cấp việc thực hiện chuẩn cho phép bạn thực hiện nó với một cuộc gọi hàm đơn giản (do đó việc viết nhanh hơn và dễ dàng hơn).

+4

Ngoài ra, bạn có thể chỉ định đối số trong lệnh 'bind()' sẽ được thêm vào danh sách đối số khi bạn gọi hàm kết quả, vd 'function add (a, b) {return a + b}; var plus5 = add.bind (null, 5); console.log (plus5 (6)/* 11 * /) ' – thejh

33

.call() - gọi hàm cùng với các đối số quy định

.apply() - gọi hàm cùng với các đối số quy định trong một mảng

.bind() - tạo ra một chức năng mới với cơ quan chức năng tương tự, với bộ tuỳ chọn giá trị của this (đối số đầu tiên) và trả về hàm đó.

Trong mọi trường hợp, đối số đầu tiên được sử dụng làm giá trị this bên trong hàm.

+1

Làm thế nào bạn có thể nói về' call', 'apply', và' bind' mà không bàn đến 'this' ?! –

+0

@ T.J.Crowder - Thêm vào đó bit quá .. :) – techfoobar

+0

'' bind() '' không gọi hàm. Xem xét rephrasing đó. – lqc

5

Sự khác biệt là cách bạn thực hiện cuộc gọi. Nếu bạn đã sử dụng bind để lấy lại một hàm có giá trị ràng buộc this, bạn chỉ cần gọi hàm:

getx(); 

Nếu bạn không có một hàm ràng buộc, và bạn muốn thiết lập this, bạn làm như vậy với call hoặc apply:

someFunction.call(objectToUseAsThis, arg1, arg2); 
// or 
someFunction.apply(objectToUseAsThis, [arg1, arg2]); 

Lưu ý rằng nếu bạn có một hàm ràng buộc (như getX của bạn), sử dụng call trên đó là vô nghĩa, bởi vì this bạn cung cấp sẽ chỉ được ghi đè bởi các ràng buộc this . (Sử dụng apply vẫn có thể hữu ích, nếu bạn có một mảng giá trị bạn muốn ass làm đối số.)

+0

'áp dụng' không phải là vô nghĩa bởi vì bạn có thể có một mảng arg và bạn không thể gọi trực tiếp. – Neil

+0

@Neil: Được rồi, điểm công bằng. –

Các vấn đề liên quan