Что означает self в javascript?

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


person Nick Van Brunt    schedule 09.07.2010    source источник
comment
Я просто хотел бы указать, что self не является ключевым словом, чтобы избежать путаницы. self - это свойство окна (свойства являются членами объектов, ключевые слова - это, по сути, то, что составляет сам язык программирования, например, если и для)   -  person Jani Hartikainen    schedule 10.07.2010
comment
Спасибо за разъяснения. я никогда не использовал js вне DOM.   -  person Nick Van Brunt    schedule 10.07.2010
comment
Никогда не доверяйте HTML Goodies, это ужасно. Это заставляет W3Schools хорошо выглядеть.   -  person Quentin    schedule 10.07.2010
comment
Я изменил вопрос в свете ответов, указывающих на то, что «я» на самом деле не является ключевым словом. Мне все еще интересно, почему он существует.   -  person Nick Van Brunt    schedule 10.07.2010
comment
Я понятия не имею, откуда они взяли идею, что self global (свойство window) когда-либо будет указывать на форму. Это полный бред. Возможно, они перепутали его с тем, на что указывает this в form onsubmit.   -  person bobince    schedule 10.07.2010


Ответы (5)


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

person Swift    schedule 09.07.2010
comment
поэтому я думаю, что self == window. Ссылка, которую я разместил, вводит в заблуждение. Если это цитата, не могли бы вы опубликовать источник? - person Nick Van Brunt; 10.07.2010
comment
Исходный источник docs.sun.com/source/816-6408-10/ окно.htm. Современный источник dev.w3.org/html5/spec/Overview.html# дом-я - person bobince; 10.07.2010

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

Все официальные версии IE (и даже IE9pr3) имеют странную нетранзитивную реализацию == с этими хост-объектами. Использование == для сравнения window или self с узлом в документе дает результат true.

IE Oddities

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

person Garrett    schedule 10.07.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();
person Chadwick    schedule 09.07.2010
comment
Хотя это работает, я полагаю, что более идиоматичным решением JavaScript будет Foo.prototype.doLater = function() { setTimeout(function() { this.doSomething(); }.bind(this), 1000); }; - person ic3b3rg; 21.10.2014

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

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

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

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

person MyUserInStackOverflow    schedule 25.03.2018

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

function Constructor() {
    var self = this;
}

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

person meder omuraliev    schedule 09.07.2010