javascript подъем для глобальной переменной и функции

Меня интересовал подъем. Я знаю, что если имя глобальной функции совпадает с глобальной переменной, функция перезаписывает имя переменной. Это правильно?

вот мой код.

(function() {
  console.log('console.log#1 ' + globalString); // globalString function 

})();

var globalString = 'I\'m globalString variable';

(function() {
  console.log('console.log#2 ' + globalString); // string
})();

function globalString() {
  console.log('I\'m globalString function');
}

Это результат, покажи мне, как удар

console.log#1 function globalString ()
{
    console.log ( 'I\'m globalString function' );
}

console.log#2 I'm globalString variable

Если определение функции перезаписывает переменную console.log#2, выведите функцию globalString. Я не знаю, как переменная и функция подъемника. пожалуйста помоги.


person Yongho.Kim    schedule 09.07.2018    source источник
comment
Функции перемещаются наверх, поэтому к моменту запуска console.log#1 это все еще функция. Затем вы перезаписываете его строковым значением. Поднимаются только объявления, а не назначения.   -  person zerkms    schedule 10.07.2018


Ответы (1)


Объявления функций (например, ваш globalString()) поднимаются. Для интерпретатора ваш код выглядит примерно так:

var globalString = function globalString() {
  console.log('I\'m globalString function');
};

(function() {
  console.log('console.log#1 ' + globalString); // globalString function 
})();

globalString = 'I\'m globalString variable';

(function() {
  console.log('console.log#2 ' + globalString); // string
})();

Перед запуском начального IIFE globalString является функцией. После запуска первого IIFE, но до запуска второго IIFE, globalString переназначается строке. Обычные присваивания не поднимаются — поднимается только имя переменной.

person CertainPerformance    schedule 09.07.2018
comment
Разве технически это не будет var globalString;, function globalString()..., остальной код? - person mhatch; 10.07.2018
comment
Я не уверен, потому что это объявление функции, а не обычная поднятая переменная. Независимо от того, как бы это ни выглядело, это не повлияет на результирующий сценарий. - person CertainPerformance; 10.07.2018
comment
Результаты, которые вы описываете, конечно, правильны, но я полагаю, что интерпретируемый порядок событий будет следующим: 1. объявить globalString 2. объявить func globalString (которая перезаписывает предыдущую неопределенную переменную) 3. первый IIFE 4. присвоить строку globalString (перезаписать объявление функции) 4. второй IIFE - person mhatch; 10.07.2018