Как подъем JS работает с оператором блока? - PullRequest
0 голосов
/ 06 мая 2018

В следующем фрагменте я просто хочу понять, почему console.log(abc in this); печатается как true, а в следующей строке console.log(abc); получает undefined

console.log(this.abc);//undefined
console.log(abc in this);//true
console.log(abc);//undefined
{
    function abc(){
        console.log("hello");
    }
}
console.log(abc); //ƒ abc(){console.log("hello");

Может ли кто-нибудь из вас объяснить, как в этом случае работают операторы Hoisting и Block?

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Проще говоря, с помощью console.log(abc in this); он проверяет, есть ли он там, какой он есть, следовательно, регистрируя true, хотя вы еще не можете получить к нему доступ, следовательно, получая undefined для двух других console.log, выполняющихся ранее. объявление функции.

0 голосов
/ 06 мая 2018

Если вы хотите знать, почему это происходит, ответ прост, подъем поднимает все объявления в верхнюю часть его области видимости, поэтому:

console.log(this.abc); //undefined
console.log(abc in this); //true
console.log(abc); //undefined

function abc() {
  console.log("hello");
}

console.log(abc); //ƒ abc(){console.log("hello");

поэтому во внутренней функции функция abc () объявляется в верхней части текущей области видимости, оставаясь почти на той же позиции, но только на объявлении, поэтому var abc объявляется и назначается, когда вы пытаетесь получить доступ к Внизу он уже знает эту функцию, в первом файле console.log, где вы получите undefined

console.log (abc) функция _abc еще не объявлена, но во втором примере у вас есть к ней доступ, потому что она обращается к объекту windows и получает abc.

Итак, вкратце, javascript сначала инициализирует переменные, поскольку во втором console.log все переменные уже объявлены, и они объявлены в объекте окна, при этом доступ к abc в этом случае работает нормально.

0 голосов
/ 06 мая 2018

В небрежном режиме this относится к глобальному объекту. Функция внутри простого нефункционального блока, подобного этому, будет переименована в переменную в область действия external , но фактическая функция не будет назначена внешней переменной (окну свойство), пока не будет выполнен внутренний блок.

Подробнее см. Здесь:

Какова точная семантика функций уровня блока в ES6?

Как объяснено в этом другом вопросе, для интерпретатора ваш код выглядит примерно так:

window.abc = undefined; // top-level hoisting assigns to window properties
console.log(window.abc); // undefined
console.log(window.abc in window); // true
console.log(window.abc); // undefined
{
  var _abc = function abc() {
    console.log("hello");
  };
  window.abc = _abc;
}
console.log(window.abc); //ƒ abc(){console.log("hello");

Причина abc in this в том, что abc инициализировано как свойство объекта окна, но ему еще не присвоено значение. Это похоже на то, что здесь происходит:

const obj = { foo: undefined };
console.log('foo' in obj);
...