Что означает «я» в javascript? - PullRequest
23 голосов
/ 10 июля 2010

Я прочитал здесь , что " 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?

Ответы [ 5 ]

12 голосов
/ 10 июля 2010

В других ответах указывалось, что self не будет ссылаться на FORM и что self равно window. Они правы; self - это window. Ну, кроме случаев, когда это не так. В IE6 или IE7 (забыл), self.onload не сработает, хотя window.onload будет.

Все официальные версии IE (и даже IE9pr3) имеют странную, непереходную реализацию == с этими хост-объектами. Используя == для сравнения window или self с узлом в документе, получается 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
10 голосов
/ 10 июля 2010

self не является зарезервированным ключевым словом или стандартным типом, но стало стандартным именем по умолчанию, когда хранится ссылка на объект для замыканий.

Здесь мы создаем замыкание для передачи на setTimeout().Когда это закрытие выполнено, this будет ссылаться на глобальный объект.Чтобы сохранить ссылку на объект foo, который был первоначально вызван doLater, используется переменная с именем self.Это может быть что угодно, но «я» имеет осмысленную семантику.

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

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

new Foo().doLater();
9 голосов
/ 10 июля 2010

Для всех окон свойства self и window объекта window являются синонимами для текущего окна, и вы можете по желанию использовать их для ссылки на текущее окно.Например, вы можете закрыть текущее окно, вызвав метод close либо window, либо self.Вы можете использовать эти свойства, чтобы сделать ваш код более читабельным или устранить неоднозначность ссылки на свойство self.status в форме с именем status.

6 голосов
/ 10 июля 2010

Никогда, если только я не хотел создать переменную self в области действия функции, ссылающейся на контекст для последующего использования,

function Constructor() {
    var self = this;
}

Вы должны использовать this для ссылки на элемент врука, а не self.В глобальном масштабе, хотя this является ссылкой на window, а self также является window.

3 голосов
/ 26 марта 2018

self относится к global scope - Если контекст является окном, он будет ссылаться на window.self, тогда как в случае неоконированного контекста он будет ссылаться на глобальную область этого контекста (например, в коде работника службы, self ссылается на глобальную область работника).

self относится к глобальной области контекста:

  • контекст окна
  • рабочий контекст (работа над поддержкой нескольких рабочих для одного и того же веб-приложения).

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

...