--- title: Function.prototype.call() slug: Web/JavaScript/Reference/Global_Objects/Function/call tags: - JavaScript - Phương Thức - hàm translation_of: Web/JavaScript/Reference/Global_Objects/Function/call ---
Phương thức call()
gọi một hàm với giá trị của this
và các đối số riêng lẻ.
Chú ý: Mặc dù hàm này có cú pháp gần giống với hàm {{jsxref("Function.prototype.apply", "apply()")}} nhưng có sự khác biệt cơ bản. Hàm call()
nhận nhiều đối số riêng lẻ, còn hàm apply()
nhận một mảng tập hợp của nhiều đối số.
function.call(thisArg, arg1, arg2, ...)
thisArg
this
được đưa ra để gọi hàm
. Lưu ý rằng this
có thể không phải ?là giá trị thực tế được thấy bởi phương thức: Nếu phương thức là một hàm trong {{jsxref("Functions_and_function_scope/Strict_mode", "non-strict mode", "", 1)}} , giá trị {{jsxref("Global_Objects/null", "null")}} và {{jsxref("Global_Objects/undefined", "undefined")}} sẽ được thay thế với global object và các giá trị sơ khai (primitive) sẽ được chuyển thành các đối tượng (objects).arg1, arg2, ...
Kết quả của của việc gọi hàm với giá trị xác định của this
và các đối số.
Một đối tượng this
có thể được chỉ định khi gọi một hàm có sẵn. this
đề cập đến đối tượng hiện tại (current object), là đối tượng đang gọi (calling object). Với hàm call
, bạn có thể viết một phương thức một lần duy nhất và sau đó thừa kế nó trong một đối tương khác mà không phải viết lại phương thức đó cho đối tượng mới.
call
để chain constructors cho một đối tượngBạn có thể sử dụng hàm call
để chain constructors cho một đối tượng giống như trong Java. Trong ví dụ dưới đây, hàm khởi tại của đối tượng Product
được định nghĩa với 2 tham số, name
và price
. Hai hàm Food
và Toy
gọi Product
với tham số this
, name
và price
. Product khởi tạo thuộc tính name
và price
, cả 2 hàm này định nghĩa category
.
function Product(name, price) { this.name = name; this.price = price; } function Food(name, price) { Product.call(this, name, price); this.category = 'food'; } function Toy(name, price) { Product.call(this, name, price); this.category = 'toy'; } var cheese = new Food('feta', 5); var fun = new Toy('robot', 40);
call
để gọi một hàm ẩn danh (anonymous function)Trong ví dụ dưới đây, chúng ta tạo một hàm ẩn danh và sử dụng hàm call
để gọi hàm đó nhận mọi đối tượng trong một mảng. Mục đích chính của hàm ẩn danh này là thêm tính năng hàm print cho mọi đối tượng, từ đó các đối tượng này có thể in ra vị trí của chúng trong mảng. Việc này có thể không cần thiết nhưng được đưa ra với mục đích ví dụ.
var animals = [ { species: 'Lion', name: 'King' }, { species: 'Whale', name: 'Fail' } ]; for (var i = 0; i < animals.length; i++) { (function(i) { this.print = function() { console.log('#' + i + ' ' + this.species + ': ' + this.name); } this.print(); }).call(animals[i], i); }
call
để gọi hàm và đưa ra một giá trị cho đối tượng 'this'Trong ví dụ dưới đây khi chúng ta gọi hàm greet , giá trị của this trong hàm greet chính là đối tượng i.
function greet() { var reply = [this.person, 'Is An Awesome', this.role].join(' '); console.log(reply); } var i = { person: 'Douglas Crockford', role: 'Javascript Developer' }; greet.call(i); // Douglas Crockford Is An Awesome Javascript Developer
Specification | Status | Comment |
---|---|---|
{{SpecName('ES1')}} | {{Spec2('ES1')}} | Initial definition. Implemented in JavaScript 1.3. |
{{SpecName('ES5.1', '#sec-15.3.4.4', 'Function.prototype.call')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-function.prototype.call', 'Function.prototype.call')}} | {{Spec2('ES6')}} | |
{{SpecName('ESDraft', '#sec-function.prototype.call', 'Function.prototype.call')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Function.call")}}