差异

2013-06-01 23 views
47

大家都知道在JavaScript this,但也有在野外遇到的self情况下,如here差异

那么,是什么在JavaScript thisself之间的区别?

+1

[并关于此](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)... –

+6

@dystroy:有一个:[' window.self'](https://developer.mozilla.org/en-US/docs/Web/API/window.self)('=== window')。尽管OP可能意味着一个简单的变量名... – Bergi

+0

哦,这个你认为呢?那么......也许你应该回答。 –

回答

55

除有其他地方的selfwindow因为的JavaScript可以访问,而不是window.x任何财产window简单地xx。因此,self确实为window.self,与this不同。

window.self === window; // true 

如果您使用的是在全球范围内执行,而不是在严格模式下,this默认为window功能,因此

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 

如果您使用的功能不同的上下文,this将参考该上下文,但self仍然是window

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

您可以找到W3C 2006 working draft for the Window Objecthere定义window.self

+9

为了完整起见,当窗口不可访问时,“self”在WebWorker环境中非常有用(https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/ Using_web_workers)。使用''self''而不是''window''可以让你以便携的方式访问全局对象。 – lqc

16

虽然我迟到了这里,但我碰到一个例子也可以帮助才明白this进一步:

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 

此前ECMA 5 ,内函数中的this会引用全局窗口对象;而在ECMA 5中,内部函数中的this将是未定义的。