2015-07-27 22 views
7

Có cách nào để rebind một hàm đã được ràng buộc với một đối tượng khác thông qua Function.prototype.bind không?Ghi đè liên kết hàm chức năng Javascript (cách liên kết nó với đối tượng khác)

var a={}; 
var b={}; 
var c=function(){ alert(this===a); }; 
c(); // alerts false 
c=c.bind(a); 
c(); // alerts true 
c=c.bind(b); 
c(); // still alerts true 

Tôi biết rằng tôi có thể sử dụng một cách tiếp cận khác và giữ chức năng "sạch" để ràng buộc, nhưng tôi tự hỏi cách sử dụng lại chức năng đã bị ràng buộc.

+1

so sánh các đối tượng với === là một ý tưởng tồi ... – epascarello

+2

@epascarello ?? – Pointy

Trả lời

6

Có cách nào để rebind một hàm đã bị ràng buộc với một đối tượng khác thông qua Function.prototype.bind không?

số Từ ES2015 spec về Function.prototype.bind:

19.2.3.2 Function.prototype.bind (thisArg, ... args)

[...]

Lưu ý 2: Nếu Mục tiêu là chức năng mũi tên hoặc hàm bị ràng buộc thì thisArg được chuyển tới phương thức này sẽ không được sử dụng bởi các cuộc gọi tiếp theo tới F.

Điều này cũng đúng với các phiên bản trước đó.

3

.bind() làm là gần như giống nhau như thế này:

function likeBind(fun, thisValue) { 
    return function() { 
    var args = [].slice.call(arguments, 0); 
    return fun.apply(thisValue, args); 
    }; 
} 

Vì vậy:

c = likeBind(c, a); 

mang đến cho bạn một hàm ràng buộc. Bây giờ, ngay cả khi bạn cố gắng liên kết lại, hàm ràng buộc ban đầu vẫn tồn tại trong phần đóng đó với giá trị ban đầu bạn yêu cầu được sử dụng làm this. Giá trị của các biến bên trong bao đóng chỉ có thể được thay đổi từ bên trong bao đóng, vì vậy không có gì bạn có thể làm để bỏ ràng buộc một hàm ràng buộc như thế. Bạn phải bắt đầu lại từ hàm ban đầu.

Vì vậy, không.

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