在JavaScript中,“self”是什么意思?

35

我在这里读到 "here",意思是"self指当前窗口或表单"。

但在这种情况下,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


11
我想指出self不是一个关键字,以避免混淆。self是window的一种属性(属性是对象的成员,关键字基本上是组成编程语言本身的东西,如"if"和"for")。 - Jani Hartikainen
1
感谢澄清。我从未在DOM之外使用过JS。 - Nick Van Brunt
17
永远不要相信HTML Goodies,它太糟糕了。这让W3Schools看起来不错。 - Quentin
我根据指出self实际上不是关键字的答案修改了问题。我仍然很好奇它为什么存在。 - Nick Van Brunt
2
我不知道他们从哪里得到的想法,认为 self 全局变量(window 属性)会指向一个表单。这完全是胡说八道。也许他们把 form onsubmit 中的 this 指向搞混了。 - bobince
5个回答

15

其他回复已经指出了self不会引用到FORM,而且selfwindow。他们是正确的;self就是window。当然,在某些情况下,它并不是这样。在IE6或IE7中(忘记哪个了),self.onload无法触发,但window.onload可以。

所有官方版本的IE(甚至是IE9pr3)都对这些宿主对象的==实现有一个奇怪的、不可传递的实现方式。使用==比较windowself与文档中的节点时,结果是true

IE的怪异行为

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


14
对于所有的窗口,window对象中的selfwindow属性是指当前窗口的同义词,并且您可以选择使用它们来引用当前窗口。例如,您可以通过调用windowselfclose方法关闭当前窗口。您可以使用这些属性使您的代码更易读或消除对self.status属性引用与名为status的表单之间的歧义。

所以我猜self == window。我发布的链接非常误导人。如果那是引用,你能发一下来源吗? - Nick Van Brunt
5
请将以下英文内容翻译成中文,仅返回翻译后的文本:原始来源http://docs.sun.com/source/816-6408-10/window.htm。现代来源http://dev.w3.org/html5/spec/Overview.html#dom-self - bobince

11

self不是一个保留关键字或标准类型,但已成为一个事实上的标准名称,用于保存闭包中对象的引用。

这里我们创建了一个闭包来传递给setTimeout()。当该闭包被执行时,this会指向全局对象。为了保留对最初调用doLaterfoo对象的引用,使用了一个名为self的变量。它可以是任何名称,但“self”具有有意义的语义。

Foo.prototype.doLater = function() {
  var self = this; // current object

  window.setTimeout(function() { self.doSomething(); }, 1000);
}

new Foo().doLater();

1
虽然这个方法可行,但我建议更符合JavaScript惯用法的解决方案是 Foo.prototype.doLater = function() { setTimeout(function() { this.doSomething(); }.bind(this), 1000); }; - ic3b3rg

10

self 指的是全局作用域 - 如果上下文是窗口,则它将指向window.self,而在非窗口化上下文的情况下,它将指向该上下文的全局作用域(例如,在服务工作者代码中,self 指的是worker全局作用域)。

self 指的是上下文的全局作用域:

  • window 上下文
  • 工作线程上下文(正在开发支持同一 Web 应用程序的多个工作线程)。

https://developer.mozilla.org/zh-CN/docs/Web/API/Window/self


6

除非我想在函数作用域中创建一个 self 变量,以便稍后引用上下文,否则不要这样做。

function Constructor() {
    var self = this;
}

你应该使用this来指代当前元素,而不是self。在全局作用域中,this是指向window的引用,而self也是指向window的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接