34

我在这里读到“ 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在 just 上使用 DOM 属性window呢?

4

5 回答 5

15

其他回复已经指出,self不会指的是FORM,那selfwindow。他们是对的;self window。好吧,除非它不是。在 IE6 或 IE7(忘记)中,self.onload不会触发,但window.onload会触发。

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

IE 怪事

警报(自我 == document.body);// 真的
警报(document.body == self);// 错误的
警报(窗口 == 自我);// 真的
警报(窗口 === 自我);//错误的
var b = document.createElement("b");
警报(窗口 == b);// 错误的
警报(窗口 == document.body.appendChild(b)); // 真的
警报(窗口 == document.body.removeChild(b)); // 错误的

于 2010-07-10T05:03:25.413 回答
14

对于所有窗口,对象的selfwindow 属性是window当前窗口的同义词,您可以选择使用它们来引用当前窗口。例如,您可以通过调用或的close方法 关闭当前窗口。您可以使用这些属性使您的代码更具可读性,或消除名为.windowselfself.statusstatus

于 2010-07-09T20:51:36.513 回答
11

self不是保留关键字或标准类型,但在保持对闭包对象的引用时已成为事实上的标准名称。

这里我们创建一个闭包传递给setTimeout(). 当执行该闭包时,this将引用全局对象。为了保持对最初调用foo对象的引用,使用了一个名为的变量。它可以是任何东西,但“自我”具有有意义的语义。doLaterself

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

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

new Foo().doLater();
于 2010-07-09T20:55:07.673 回答
9

self指的是全局范围- 如果上下文是一个窗口,它将引用 window.self,而在非窗口上下文的情况下,它将引用该上下文的全局范围(例如,在 service worker 代码中,self 指工作人员全局范围)。

self 指的是上下文的全局范围:

  • 窗口上下文
  • 工作人员上下文(正在研究对同一 web 应用程序的多个工作人员的支持)。

https://developer.mozilla.org/en-US/docs/Web/API/Window/self

于 2018-03-25T22:52:57.897 回答
6

永远不要,除非我想self在引用上下文的函数范围内创建一个变量以供以后参考,

function Constructor() {
    var self = this;
}

您应该使用this来引用手头的元素,而不是self. 尽管在全局范围内this是对 的引用window,并且self也是window

于 2010-07-09T20:48:51.640 回答