Yehuda Katz có a good writeup phương thức Function#call
của JavaScript. Bài viết của anh ấy sẽ trả lời câu hỏi của bạn và nhiều câu hỏi tiếp theo bên cạnh.
Khi bạn gọi một chức năng trực tiếp, sử dụng cú pháp chung:
var foo = function() {
console.log("foo");
return this;
};
foo(); // evaluates to `window`
Sau đó this
bên trong gọi hàm là bất cứ điều gì this
nằm ngoài lời gọi hàm. Theo mặc định, trong trình duyệt, this
bên ngoài bất kỳ cuộc gọi chức năng nào là window
. Vì vậy, bên trong cuộc gọi hàm như trên, this
cũng theo mặc định window
.
Khi bạn gọi một chức năng sử dụng cú pháp phương pháp gọi:
var bar = {
foo: function() {
console.log("foo");
return this;
}
};
bar.foo(); // evaluates to `bar`
Sau đó this
bên trong gọi hàm là đối tượng bên trái của giai đoạn ngoài cùng bên phải: trong trường hợp này, bar
.
Chúng tôi có thể mô phỏng tình huống này bằng cách sử dụng call
.
Khi bạn thiết lập một chức năng bên ngoài một đối tượng và muốn gọi nó với this
bên trong gọi hàm thiết lập để một đối tượng, bạn có thể:
var foo = function() {
console.log("foo");
return this;
}
var bar = { };
foo.call(bar); // evaluates to `bar`
Bạn có thể sử dụng kỹ thuật này để vượt qua đối số cũng như:
var foo = function(arg1, arg2) {
console.log("foo");
return arg1 + arg2;
}
var bar = { };
foo.call(bar, "abc", "xyz"); // evaluates to `"abcxyz"`
[Cuộc gọi tài liệu MDN()] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call) – epascarello