2013-06-01 28 views
47

Mọi người đều nhận thức được this trong javascript, nhưng cũng có trường hợp của self gặp trong tự nhiên, chẳng hạn như herekhác biệt giữa điều này và tự trong JavaScript

Vì vậy, sự khác biệt giữa thisself trong JavaScript là gì?

+1

[Và về vấn đề này] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this) ... –

+6

@dystroy: Có một: [ ' window.self'] (https://developer.mozilla.org/en-US/docs/Web/API/window.self) ('=== cửa sổ'). Mặc dù OP có thể có nghĩa là một tên biến tầm thường… – Bergi

+0

Ồ, cái này bạn nghĩ sao? Vâng ... có lẽ bạn nên trả lời sau đó. –

Trả lời

55

Trừ khi thiết lập ở những nơi khác, giá trị của selfwindowJavascript cho phép bạn truy cập vào bất cứ tài sản x của window một cách đơn giản x, thay vì window.x. Do đó, self thực sự là window.self, khác với this.

window.self === window; // true 

Nếu bạn đang sử dụng một chức năng được thực hiện trong phạm vi toàn cầu và không có trong chế độ nghiêm ngặt, this mặc định là window, và do đó

function foo() { 
    console.log(
     window.self === window, // is self window? 
     window.self === this, // is self this? 
     this === window   // is this window? 
    ); 
} 
foo(); // true true true 

Nếu bạn đang sử dụng một hàm trong một ngữ cảnh khác, this sẽ đề cập đến ngữ cảnh đó, nhưng self vẫn sẽ là window.

// invoke foo with context {} 
foo.call({}); // true false false 

Bạn có thể tìm thấy window.self được xác định trong W3C 2006 working draft for the Window Objecthere.

+9

Để hoàn thành, '' self'' hữu ích trong ngữ cảnh của WebWorker khi cửa sổ không truy cập được (https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/ Using_web_workers). Sử dụng '' self'' thay vì '' window'' cho phép bạn truy cập đối tượng toàn cầu theo cách di động. – lqc

16

Mặc dù tôi trễ ở đây nhưng tôi đã xem qua một ví dụ mà cũng có thể hữu ích để hiểu this thêm:

var myObject = { 
foo: "bar", 
func: function() { 
    var self = this; 
    console.log("outer func: this.foo = " + this.foo); 
    console.log("outer func: self.foo = " + self.foo); 
    (function() { 
     console.log("inner func: this.foo = " + this.foo); 
     console.log("inner func: self.foo = " + self.foo); 
    }()); 
    } 
}; 
myObject.func(); 

O/P

outer func: this.foo = bar 
outer func: self.foo = bar 
inner func: this.foo = undefined 
inner func: self.foo = bar 

Trước ECMA 5 , this trong hàm bên trong sẽ tham chiếu đến đối tượng cửa sổ chung; trong khi đó, như ECMA 5, this trong hàm bên trong sẽ không được xác định.

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