Все знают о this
в javascript, но есть также примеры self
, встречающиеся в дикой природе, такие как здесь
Итак, в чем разница между this
и self
в JavaScript?
Все знают о this
в javascript, но есть также примеры self
, встречающиеся в дикой природе, такие как здесь
Итак, в чем разница между this
и self
в JavaScript?
Если не указано иное, значение self
равно window
, потому что JavaScript позволяет вам получить доступ к любому свойству x
of window
как просто x
вместо window.x
. Поэтому self
действительно window.self
, который отличается от this
.
window.self === window; // true
Если вы используете функцию, выполняемую в глобальной области видимости, this
имеет значение window
и, следовательно,
function foo() {
console.log(
window.self === window, // is self window?
window.self === this, // is self this?
this === window // is this window?
);
}
foo(); // true true true
Если вы используете функцию в другом контексте, this
будет ссылаться на этот контекст, но self
по-прежнему будет window
.
// invoke foo with context {}
foo.call({}); // true false false
Вы можете найти window.self
, определенный в рабочем проекте W3C 2006 для объекта Window здесь.
Хотя я опаздываю здесь, но я наткнулся на один пример, который тоже может быть полезен для понимания this
далее:
var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo);
(function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}());
}
};
myObject.func();
O/P
outer func: this.foo = bar
outer func: self.foo = bar
inner func: this.foo = undefined
inner func: self.foo = bar
До ECMA 5
this
во внутренней функции будет ссылаться на глобальный объект окна; тогда как по ECMA 5this
во внутренней функции будет undefined.
нет Исправление: поскольку gal007 упоминает в комментариях self
self
, когда не определено, будет ссылка на глобальный объект window
programemrs иногда используют переменную self
, чтобы ссылаться на this
, когда они меняют области видимости и все равно должны ссылаться на this
, но не могут измениться, потому что контекст изменился.