JavaScript和JavaScript之间的区别
大家都知道this
在JavaScript中,但也有self
在野外遇到的情况下,如在这里
那么, this
和JavaScript的self
什么区别呢?
除非在别处设置,否则self
的值是window
因为JavaScript允许您访问window
任何属性x
,而不是window.x
。 所以, self
真的是window.self
self
,与this
不同。
window.self === window; // true
如果您使用的是在全局范围内执行的函数,则将其设置为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
你可以在这里find在Window对象 W3C 2006工作草案中定义的window.self
。
虽然我在这里已经很晚了,但是我遇到了一个可以帮助我们进一步理解的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
在内部函数中是不确定的。
没有修正:正如gal007中提到的那样,在self
self
定义的时候没有定义就是对全局window
对象的引用
程序员有时在自己修改范围的时候会self
variables来引用this
variables,但是仍然需要引用this
但是由于上下文已经改变,所以不能this
。
没有“自我”,除非你使用一个实现它的框架,但是默认情况下在Javascript中只有“this”。
即使在上下文发生变化的情况下,“自我”也被用来保持对“原始”的引用。 这是一个常用于事件处理程序的技术。
SomeClass.prorotype.addButton(){ var self = this; // this = SomeClass instance someButton.onclick = function(){ //Here this = someButton //Here self = SomeClass instance self.showDefauMessage(); } } SomeClass.prorotype.showDefauMessage(){ alert("Default message"); }
如果你在一个事件中使用“this”,这个= someButton,你需要这个= SomeClass。 所以你需要将“this”的引用保存到“self”中以使用内部事件。
如果你在操纵DOM ,那么window = self。 尝试:
alert(window == self);
希望它能帮助你!