Я пытаюсь выполнить небольшой фрагмент кода и посмотреть. Я получил следующие результаты. Дал объяснение каждому результату. Ребята подскажите правильно это или нет?
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();
outer func: this.foo = bar ------------> since it has access to outside object
outer func: self.foo = bar ------------> since it has access to outside object
inner func: this.foo = undefined ------------> dont know why its undefined
inner func: self.foo = bar ------------> since it has access to variable self
2 ответа
Это undefined
во внутренней функции, потому что она находится внутри самовызывающейся функции. В самовызываемой функции значение this
становится глобальным объектом window
. Итак, поскольку window.foo
не определено, this.foo
также не определено, поскольку this === window
в этой внутренней функции.
this
является глобальным объектом (или не определен в строгом режиме), var self1 = this
ведет себя так, как ожидалось.
Код:
(function() {
console.log(this);
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}());
Это немедленно выполняемая функция, которая связывает this
с глобальным объектом, что означает, что this.foo
фактически просматривает глобальные переменные.
Назначение var self = this;
во внешней функции состоит в том, чтобы позволить вам получить доступ к this
внешней функции из внутренней функции.
При желании вы можете изменить контекст, заданный немедленно выполняющейся функции, с помощью Function.prototype.call()
,
(function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}).call(this); // outer this now === inner this
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.
this