Javascripts .call()
và .apply()
phương thức cho phép bạn đặt bối cảnh cho một hàm.
var myfunc = function(){
alert(this.name);
};
var obj_a = {
name: "FOO"
};
var obj_b = {
name: "BAR!!"
};
Bây giờ bạn có thể gọi:
myfunc.call(obj_a);
Mà sẽ cảnh báo FOO
. Cách khác, đi qua obj_b
sẽ cảnh báo BAR!!
. Sự khác biệt giữa .call()
và .apply()
là .call()
có một danh sách được phân tách bằng dấu phẩy nếu bạn truyền đối số cho hàm của mình và .apply()
cần một mảng.
myfunc.call(obj_a, 1, 2, 3);
myfunc.apply(obj_a, [1, 2, 3]);
Do đó, bạn có thể dễ dàng viết một hàm hook
bằng cách sử dụng apply()
phương thức. Chẳng hạn, chúng tôi muốn thêm một tính năng cho .css()
phương thức jQuery . Chúng ta có thể lưu trữ tham chiếu chức năng ban đầu, ghi đè chức năng bằng mã tùy chỉnh và gọi chức năng được lưu trữ.
var _css = $.fn.css;
$.fn.css = function(){
alert('hooked!');
_css.apply(this, arguments);
};
Vì arguments
đối tượng ma thuật là một mảng giống như đối tượng, chúng ta có thể chuyển nó tới apply()
. Bằng cách đó, chúng tôi đảm bảo rằng tất cả các tham số được truyền qua chức năng ban đầu.