В этих кодах, как объяснить результат вывода, используя контекст выполнения? - PullRequest
0 голосов
/ 12 апреля 2019
var obj={
            say: function(){
                console.log(obj); // undefined
            }()
        };

Наконец, выводится undefined. И я начал объяснять это, используя знание контекста выполнения, но у меня возникли сомнения относительно того, когда метод создается в контексте.

Я знаю, что послевходя в контекст, мы сначала вступаем в фазу создания и имеем переменный объект, который включает объявления переменных и функций. Далее мы входим в фазу выполнения и заканчиваем присваивание переменных и функций. Так что в этом примере мы:

Сначала введите фазу создания глобального контекста исключения, и obj будет undefined.Затем, после фазы создания, мы входим в фазу выполнения. Коды начинают извиняться, и obj теперь указывает на объект. Однако, в процессе выше, когда создается метод say? Во время фазы создания глобальнойФаза выполнения или выполнения глобального выполнения?

(Если на этапе создания объект переменной глобального контекста выполнения должен иметь вид AO={ obj:undefined,say: referencce to <function>})

Или есть ли лучший способобъяснить, почему здесь результат undefined?Я искал в Интернете и видел, что кто-то сказал, что это потому, что поднимал. Это правильно?

1 Ответ

1 голос
/ 12 апреля 2019

Это потому, что вы немедленно вызываете функцию без присвоения значения obj.Сравните два сценария в нижнем фрагменте:

var obj = {
  say: function() {
    console.log(obj); // Not undefined since it will run after obj is assigned
  }
};
obj.say();

var objUndef = {
  say: function() {
    console.log(objUndef); // undefined
  }() // <--- immediately calling
};
В вашем примере вы назначаете не функцию, а скорее результат функции (потому что вы вызываете ее немедленно с помощью ()), которая выполняется до того, как obj даже назначен.Таким образом, в результате вы записываете в консоль неопределенное значение вместо значения obj.Если вы сначала создадите объект, а затем вызовете его метод say с помощью obj.say(), будет определен объект obj, поскольку вы сначала назначаете объект obj, прежде чем пытаться вызвать его.
...