2010-07-09 207 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