2010-07-09 221 views
21

我看过here即“self”指当前窗口或表格“。“自我”在JavaScript中意味着什么?

自我似乎并不指目前的形式在这种情况下:

<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

+9

我只是想指出的是,自不是一个关键字,以避免混乱。 self是窗口的属性(属性是对象的成员,关键字本质上是编程语言本身的组成部分,例如“if”和“for”) – 2010-07-09 20:49:51

+0

感谢您的澄清。我从来没有在DOM之外使用js。 – 2010-07-09 20:52:51

+17

永远不要相信HTML的好东西,它是**糟糕的**。它使得W3School看起来不错。 – Quentin 2010-07-09 20:58:25

回答

8

对于所有的窗户,window对象的selfwindow 性能 同义词为当前窗口, 您可以选择使用它们来指代 当前窗口。例如, 您可以通过拨打 来关闭当前窗口 windowselfclose方法。您可以使用这些 属性使您的代码更易于读取或012,属性参考self.status可以从 表单调用status

+0

所以我猜自己==窗口。我发布的链接非常具有误导性。如果这是一个报价,你可以发布源? – 2010-07-09 20:54:32

+4

原始来源http://docs.sun.com/source/816-6408-10/window.htm。现代的源http://dev.w3.org/html5/spec/Overview.html#dom-self – bobince 2010-07-09 21:13:40

6

从来没有,除非我想在指供以后参考上下文中的功能范围创建self变量,

function Constructor() { 
    var self = this; 
} 

您应该使用this来指代元素在眼前,不self。在全球范围内,虽然thiswindow的参考,而self也是window

9

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

这里我们创建一个闭包,传递给setTimeout()。当执行该闭包时,this将引用全局对象。为了保持对foo对象doLater的引用最初被调用,使用名为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 2014-10-21 07:32:06

12

其他答复指出,self不会指FORMselfwindow。他们是对的; selfwindow。那么,除非没有。在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