Что означает "я" в javascript?
Я читаю здесь, что "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
?
Ответы
Ответ 1
Для всех окон self
и window
свойствами объекта window
являются синонимы текущего окна и вы можете по желанию использовать их для в текущее окно. Например, вы можете закрыть текущее окно вызывая метод close
window
или self
. Вы можете использовать эти свойства, чтобы сделать ваш код более читаемых или устранить ссылка свойства self.status
из формы называется status
.
Ответ 2
В других ответах указано, что self
не будет ссылаться на FORM
и что self
есть window
. Они правы; self
- window
. Хорошо, если только это не так. В IE6 или IE7 (забыли) self.onload
не срабатывает, хотя window.onload
будет.
Все официальные версии IE (и даже IE9pr3) имеют нечетную, непереходную реализацию ==
с этими объектами хоста. Используя ==
для сравнения window
или self
с node в документе, результат 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
Ответ 3
self
не является зарезервированным ключевым словом или стандартным типом, но становится стандартным именем defacto, если для хранения ссылки на объект для закрытия.
Здесь мы создаем замыкание, чтобы перейти к setTimeout()
. Когда это закрытие выполняется, this
будет ссылаться на глобальный объект. Чтобы сохранить ссылку на объект foo
doLater
, изначально был вызван, используется var с именем self
. Это может быть что угодно, но "я" имеет смысловую семантику.
Foo.prototype.doLater = function() {
var self = this; // current object
window.setTimeout(function() { self.doSomething(); }, 1000);
}
new Foo().doLater();
Ответ 4
Никогда, если я не хочу создать переменную self
в области действия функции, ссылающейся на контекст для последующей ссылки,
function Constructor() {
var self = this;
}
Вы должны использовать this
для ссылки на элемент, а не self
. В глобальном масштабе, хотя this
является ссылкой на window
, а self
также window
.