2012-02-09 30 views

Trả lời

8

window là tham chiếu đến cửa sổ trình duyệt hiện tại mà tập lệnh thực hiện. window.self rõ ràng là tự tham chiếu của chính nó. Và kể từ self đây là thuộc tính của đối tượng toàn cầu window, nó cũng có thể được truy cập như thể nó là một biến "toàn cục": chỉ self.

Vì vậy, ba trường hợp cuối cùng trong hầu hết các trường hợp thực sự giống nhau.

this tuy nhiên hoàn toàn khác: đó là biến trỏ đến phạm vi hiện tại. Nếu bạn thực hiện đoạn mã sau vào giao diện điều khiển:

> var myPackage = {} 
> myPackage.method = function() {console.log(this)} 
> myPackage.method() 

this sẽ được trỏ đến đối tượng myPackage (phạm vi method).

+2

+1, nhưng chỉ để là pedantic, 'self' và' window' là cả hai tham chiếu đến đối tượng toàn cầu javascript - chứa hai thuộc tính 'self' và' window' (cả hai trỏ tới chính nó). Có nghĩa là không có "như thể" - 'cửa sổ' chỉ là một tài sản của' self' là 'self' là thuộc tính của' window'. Và để thêm một cái gì đó (hơi) ít pedantic: tất cả điều này (ngoại trừ 'this' ... ;-)) chỉ là một nhất định cho ECMA/Javascript trong một trình duyệt. Cả 'cửa sổ' lẫn' self' đều là các phần của ngôn ngữ, và có thể không có mặt trong các ứng dụng khác của ECMA/Javascript. – JimmiTh

+0

Việc thêm vào bộ khung, trong IE, 'cửa sổ' là ... đặc biệt. Đối với tất cả các mục đích thực tế, 'window',' self' và 'window.self' (và' this' trong một số ngữ cảnh) vẫn tương đương, * nhưng * toán tử bình đẳng nghiêm ngặt nói đó là một đối tượng khác. Trong bối cảnh toàn cầu, tất cả các biểu thức này được đánh giá là đúng trong IE: 'window === this',' window! == self', 'window! == window.window' và' window! == window.self '. Toán tử '==' nói tất cả chúng đều bình đẳng. –

2
this 
DOMWindow 

this luôn là bối cảnh thực tế một biểu thức JavaScript được gọi vào. Vì vậy, trong trường hợp của bạn bối cảnh toàn cầu của mình, đó là đối tượng cửa sổ khi bạn chạy nó trong trình duyệt. Lưu ý chạy giống nhau trong nodeJs sẽ cho bạn một kết quả khác.

self 
//DOMWindow 

From the MDN Docs:

Trả về một tham chiếu đối tượng để các đối tượng cửa sổ.

window 
// DOMWindow 

Điều bạn gọi là: đối tượng cửa sổ.

window.self 
//DOMWindow 

Nó giống như tự gọi ở trên khiến cho ngữ cảnh của bạn là cửa sổ. Vì vậy, hãy gọi window.self hoặc chỉ self hoặc this.self, khi bạn đang ở trong phạm vi toàn cầu, là như nhau.

1

Luôn từ khóa này đề cập đến ngữ cảnh mà nó được gọi. Nhưng tự và cửa sổ ngay cả sau khi thay đổi ngữ cảnh đề cập đến cửa sổ chính nó.

// Log function 
function logAll(){ 
    console.log("this >", this); 
    console.log("self >", self); 
    console.log("window >", window); 
    console.log("window.self >", window.self); 
    console.log("this.self >", this.self); 
}; 

// Class Car 
function Car(){ 
    this.self = 6; 
}; 

// Instance of Car 
var honda = new Car(); 
honda.self = 5; 

// logAll() called in context Gloabal 
logAll(); 

// Outputs 
this > Window 
self > Window 
window > Window 
window.self > Window 
this.self > Window 

// logAll() called in context honda 
logAll.call(honda); 

// Outputs 
this > Car { self= 5 } 
self > Window 
window > Window 
window.self > Window 
this.self > 5 

đây bạn có thể nhìn thấy cửa sổ this.self lợi nhuận trong khi gọi trong phạm vi toàn cầu bởi vì trong phạm vi toàn cầu

this = windows 
this.self = windows.self 
this.self = Windows 

Nhưng trong khi bạn đang ở trong bối cảnh của honda, một thể hiện của xe:

this = honda 
this.self = honda.self 
this.self = 5 

Ngữ cảnh đóng một vai trò quan trọng trong Javascript, trong khi làm việc với OOP và thừa kế.

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