2012-04-04 39 views
7

Đây là điều mà tôi chắc chắn tôi nên biết câu trả lời, nhưng tôi chỉ là ngu ngốc hoặc tôi chỉ bằng cách nào đó không bao giờ bắt gặp điều này trước ...Ngữ cảnh của một hàm trong một mảng là gì?

Cho mảng sau, được khai báo trong phạm vi toàn cầu:

var arr = [function() { 
    console.dir(this); 
}]; 

Tôi đã mong đợi this để tham chiếu đến đối tượng Window. Tuy nhiên, khi gọi hàm:

arr[0]();​ //Logs Array 

Có vẻ như this thực sự đề cập đến mảng. Sau đó, khi tôi lưu trữ một tham chiếu đến các chức năng trong một biến khác và gọi đó là, thiskhông tham khảo các đối tượng Window:

var func = arr[0]; 
func(); //Logs Window 

Vì vậy, tại sao bối cảnh của sự thay đổi chức năng? Đây là một số fiddle demonstrating the above two cases.

+0

'this' đề cập đến chủ sở hữu vì vậy tôi đoán chủ sở hữu được tra cứu tại thời gian thực thi. http://www.quirksmode.org/js/this.html – Silvermind

Trả lời

5

Khi bạn gọi một chức năng là tài sản của một đối tượng, chẳng hạn như obj.func(), this đề cập đến obj.
Đây chính xác là những gì bạn đang làm ở đây. arr là đối tượng của bạn và 0 là thuộc tính đang giữ chức năng.

Lưu ý: Sau khi tất cả, mảng chỉ là đối tượng và phần tử của chúng là giá trị thuộc tính của chúng (mặc dù thuộc tính thường là chuỗi số (tất cả các thuộc tính là chuỗi)).

Xem MDN - this để biết thêm thông tin, trong trường hợp này:

Khi một hàm được gọi là một phương pháp của một đối tượng, this của nó được thiết lập để các đối tượng phương pháp này được gọi vào.

Trong trường hợp thứ hai, bạn gọi hàm là "độc lập", do đó this đề cập đến window. Nếu mã được chạy ở chế độ nghiêm ngặt, this sẽ là undefined.

+0

Chính xác hơn 'cửa sổ' ** là ** một đối tượng và toàn cục ** là đối số của' cửa sổ'. – freakish

+0

"Sau khi tất cả, mảng chỉ là đối tượng" ... mà làm cho nó làm cho cảm giác hoàn hảo. Tôi chỉ là ngu ngốc. Cảm ơn. –

+0

@freakish: Điều này liên quan đến câu hỏi như thế nào? 'this' đề cập đến' window' ngay cả khi biến không phải là global. Trong mã OP, 'func' cũng có thể là biến cục bộ trong một số hàm khác. Tôi giả sử bạn có nghĩa là các biến toàn cục là * properties * của 'window'. –

0

Điều này là do this từ khóa thực sự là một toán tử trả về tham chiếu đến chủ sở hữu (hoặc chủ sở hữu) của một hàm mà nó được gọi. Vì trong trường hợp đầu tiên, người giữ là một mảng (là một đối tượng), nó trả về một mảng. Trong trường hợp thứ hai, chủ sở hữu là đối tượng cửa sổ.

Xem this article để biết thêm chi tiết.

0

lưu ý:

trong JavaScript, this luôn đề cập đến chủ sở hữu chức năng.

bạn có thể đọc thêm về nó at quirksmode.

0

Bởi vì nguyên tố này là thành viên của mảng, và thisluôn điểm đến đối tượng chủ sở hữu (trừ khi bạn chơi với bind()/call()/apply() vv). Nếu bạn không phải là một phần của một đối tượng, this sẽ là đối tượng toàn cục; là window trong môi trường trình duyệt. Ngoại lệ cho điều này là nếu bạn đang ở chế độ nghiêm ngặt, trong đó thiswill be undefined.

bạn đang làm gì là có hiệu quả tương tự như:

var ar = { 
    '0' : function() { 
     console.dir(this); 
    } 
} 

ar[0](); 
var func = ar[0]; 
func(); 

... mà có thể làm cho ý nghĩa hơn về mặt khái niệm.

http://jsfiddle.net/TVtwr/1/

+0

Nó không hoàn toàn giống nhau. Một mảng là một "loại" khác với hành vi khác nhau đối với một đối tượng đơn giản. –

+0

@MichaelAnderson: Ý tôi là về độ phân giải của 'this'. – Matt

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