2011-09-01 41 views
8

Tôi có câu hỏi về 'gọi' trong javascript.'Gọi' hoạt động như thế nào trong javascript?

var humanWithHand = function(){ 
    this.raiseHand = function(){ 
     alert("raise hand"); 
    } 
} 

var humanWithFoot = function(){ 
    this.raiseFoot = function(){ 
     alert("raise foot"); 
    } 
} 

var human = function(){ 

    humanWithHand.call(this); 
    humanWithFoot.call(this); 

} 

var test = new human(); 

vì vậy .. khi nào tôi sử dụng 'gọi' là con ngườiCó một điều gì xảy ra bên trong?

có humanWithHand biến bản sao (hoặc điểm?) Thuộc tính và thành viên của nó vào nguyên mẫu của biến con người?

+0

[Cuộc gọi tài liệu MDN()] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call) – epascarello

Trả lời

7

.call() đặt giá trị this và sau đó gọi hàm với các đối số bạn truyền cho .call(). Bạn sử dụng .call() thay vì chỉ gọi hàm trực tiếp khi bạn muốn đặt giá trị this bên trong hàm được gọi thay vì để cho nó được đặt thành bất kỳ javascript nào bình thường sẽ đặt nó thành.

.apply() là hàm chị em. Nó cũng có thể đặt giá trị this và có thể sử dụng đối số trong mảng để có thể sử dụng khi bạn đang cố chuyển danh sách đối số biến từ một số hàm gọi khác hoặc khi bạn đang xây dựng danh sách đối số. các đối số tùy thuộc vào tình huống.

9

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"` 
+0

Giải thích tuyệt vời –

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