2010-01-29 33 views
5

Về cơ bản, tôi đang cố gắng hiểu và tìm hiểu nguyên tắc làm việc của từ khóa 'này' trong JavaScript.Từ khoá 'này' đề cập đến đối tượng nào trong một hàm bên trong một hàm khác?

Theo như tôi hiểu 'this' đề cập đến đối tượng (chức năng) mà nó là bên trong tại thời điểm đó.

Vì vậy, bằng cách tin điều này, tôi muốn kiểm tra đầu ra của mã đơn giản dưới đây:

<body> 

<input type="button" value="Add Age" onclick="Outer()" /> 

<script type="text/javascript"> 

function Outer(){ 

if(typeof this.Father == 'undefined') 
    { 
     this.Father = 0; 
    } 

this.Father+=2; 
alert(this.Father); 

inner(); 

     function inner(){ 
      if(typeof this.Son== 'undefined') 
      { 
       this.Son = 0; 
      }; 

      this.Son++; 
      alert(this.Son); 
      alert(this.Father); 
     }; 
}; 
</script> 
</body> 

Và sản lượng của nó bối rối cho tôi. Bởi vì trong hàm inner(), this.Son xuất ra giá trị số nguyên tăng dần của Con. Nhưng tôi mong đợi this.Father thất bại vì inner() không có thuộc tính .Father. Nhưng thay vì ném một ngoại lệ nó cảnh báo giá trị của this.Father -Which dường như

  • một dòng trên 'này' là bên trong()
  • và sau dòng 'này' là Outer()

tại thời điểm này tôi có 2 câu hỏi trong tâm trí của tôi actualy:

  1. Liệu từ khoá 'này' luôn luôn đề cập đến nhà ở phạm vi của bên ngoài ngay cả bên trong các chức năng bên trong?

  2. Và không có bất kỳ trường hợp nào được khai báo từ khóa 'this' này tham chiếu những gì trong phương pháp? (Tôi có nghĩa là một cái gì đó mà không cần phải Lik var myFamily = new Outer())

Cảm ơn,

Burak ozdogan

Trả lời

5

this được xác định bởi mô hình gọi, đó là, làm thế nào một đối tượng hàm được gọi.

Có 4 loại khác nhau của mô hình gọi:

  1. phương pháp gọi: chức năng được định nghĩa là một tài sản của một số đối tượng, và được gọi là thông qua các đối tượng sử dụng tinh tế, có nghĩa là, ..

    a.func(); // this đề cập đến đối tượng, ví dụ: a.

  2. gọi hàm: gọi hàm đồng bằng.

    func(); // this là liên kết với đối tượng chung.

  3. gọi trình dẫn dòng: tốt, nó phức tạp một chút. Vì các hàm tạo được sử dụng như, tốt, phương thức consturctor cho các đối tượng hàm mới là new, this đề cập đến đối tượng hàm mới được tạo ra.

    var func = new Func(); // this đề cập đến func trong khi ở Func constructor)

  4. áp dụng gọi:

    func.apply (thisArg, argArray); // this là trái phiếu cho các đối số đầu tiên

Nói cách khác, this trong ví dụ của bạn tất cả đề cập đến đối tượng toàn cầu (bạn onClick gọi Other()). Bạn nên thử sử dụng new Other() để thay thế.

+0

Cảm ơn, đây thực sự là thông tin hữu ích. bạn có thể tìm thấy một số chi tiết về các mẫu gọi trong bài viết này: http://mcarthurgfx.com/blog/article/4-ways-functions-mess-with-this – pencilCake

+0

Và điều này cũng khá giải thích: Hàm gọi trong JavaScript - ngữ cảnh được xem xét lại - http://msmvps.com/blogs/luisabreu/archive/2009/08/24/function-invocation-in-javascript-contexts-revisited.aspx – pencilCake

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