我读了here“ self指的是当前窗口或表单”。
在这种情况下,自我似乎不是指当前的形式:
<form><input type="text" onkeyup="alert(self.foo.value)" name="foo"></form>
然而在这种情况下它起作用(参考窗口):
<form><input type="text" onkeyup="alert(self.document.forms[0].foo.value)" name="foo"></form>
那么什么时候才使用self
DOM属性而不是window
?
答案 0 :(得分:12)
其他回复指出self
不会引用FORM
而self
是window
。他们是对的; self
是 window
。好吧,除非它不是。在IE6或IE7中(忘了),虽然self.onload
会window.onload
,但==
不会触发。
IE的所有官方版本(甚至IE9pr3)都有==
与这些主机对象的奇怪,不及时的实现。使用window
将self
或true
与文档中的节点进行比较,结果为{{1}}。
IE Oddities
alert(self == document.body); // true alert(document.body == self); // false alert(window == self); // true alert(window === self); //false var b = document.createElement("b"); alert(window == b); // false alert(window == document.body.appendChild(b)); // true alert(window == document.body.removeChild(b)); // false
答案 1 :(得分:10)
self
不是保留关键字或标准类型,但在保持对闭包对象的引用时已成为事实上的标准名称。
这里我们创建一个传递给setTimeout()
的闭包。执行该闭包时,this
将引用全局对象。为了保持对最初调用的foo
对象doLater
的引用,使用名为self
的var。它可能是“自我”具有有意义的语义。
Foo.prototype.doLater = function() {
var self = this; // current object
window.setTimeout(function() { self.doSomething(); }, 1000);
}
new Foo().doLater();
答案 2 :(得分:9)
对于所有窗口,
self
和window
window
对象的属性是 当前窗口的同义词,和 您可以选择使用它们来引用 到当前窗口。例如, 你可以关闭当前窗口 调用其中任何一个的close
方法window
或self
。你可以使用这些 属性使您的代码更多 可读或消除歧义 属性参考self.status
来自a 形式称为status
。
答案 3 :(得分:6)
从不,除非我想在函数范围内创建一个self
变量,引用上下文以供日后参考,
function Constructor() {
var self = this;
}
您应该使用this
来引用手头的元素,而不是self
。在全局范围内,this
是对window
的引用,self
也是window
。
答案 4 :(得分:3)
自我是指全球范围 - 如果上下文是一个窗口,它将引用window.self,而在非窗口上下文的情况下,它将引用该上下文的全局范围(例如,在服务工作者代码中,self指的是工作者全局范围)。 / p>
self指的是上下文的全局范围:
https://developer.mozilla.org/en-US/docs/Web/API/Window/self