Я пытаюсь выполнить небольшой фрагмент кода и посмотреть. Я получил следующие результаты. Дал объяснение каждому результату. Ребята подскажите правильно это или нет?

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
1
user4483701 23 Янв 2015 в 23:25
Для внутренней функции он снова создаст свой собственный this
 – 
Pankaj Parkar
23 Янв 2015 в 23:51

2 ответа

Это undefined во внутренней функции, потому что она находится внутри самовызывающейся функции. В самовызываемой функции значение this становится глобальным объектом window. Итак, поскольку window.foo не определено, this.foo также не определено, поскольку this === window в этой внутренней функции.

2
Mike 23 Янв 2015 в 23:45
Для внутренней функции, когда я меняюсь на self1, она по-прежнему показывает undefined jsfiddle.net/5o1fszmk
 – 
user4483701
24 Янв 2015 в 00:09
Это связано с тем, что IIFE this является глобальным объектом (или не определен в строгом режиме), var self1 = this ведет себя так, как ожидалось.
 – 
jdphenix
24 Янв 2015 в 00:20

Код:

    (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
0
jdphenix 23 Янв 2015 в 23:47