Способ понять этот код. Как это работает? - PullRequest
1 голос
/ 26 мая 2019

Я изучал возможности в javascript и узнал эту проблему.Я не понимаю, как эта проблема работает.

function checkType() {
  return foo;
  foo = 10;

  function foo() {};
  var foo = 11;
};

console.log(typeof checkType())

Мой вопрос заключается в следующем: как компилятор javascript решает вернуть функцию, а не переменную.Любые ссылки или объяснения приветствуются.

Ответы [ 3 ]

2 голосов
/ 26 мая 2019

Так компилятор скомпилирует приведенный выше код.

function checkType() {
  var foo = function() {}; /* function will be hoisted to the top, 
                              and will be assigned to the variable as 
                              the name is the same for the two.. */
  return foo;

  // Code will never reach here as you are returning before this
  foo = 10;
  foo = 11;
};

console.log(typeof checkType());

Функции, которые определены с использованием синтаксиса function(), будут подняты, в этом случае вложенная функция будет поднята до checkType() и, следовательно, checkType() возвращает функцию вместо целого числа.

Примечание: поскольку функция была определена с использованием синтаксиса function(){}, она был поднят в область родительской функции, иначе, если функция была определяется с помощью var foo = function() {}, тогда подъем не будет сработали бы так же, ваша функция возвратила бы undefined.

Дополнительная информация по Scoping & Hoisting

1 голос
/ 26 мая 2019

Сначала все объявления функций выводятся в область видимости.Поэтому в первую очередь код перемещает переменную foo в верхнюю часть области и инициализирует ее значение функцией.

Второе объявление переменной не поднимается, поскольку объявление функции уже поднято.Так что код такой же как

function checkType() {
  var foo = function(){}
  return foo;
  foo = 10;

  foo = 11; 
};
0 голосов
/ 26 мая 2019

Когда мы запускаем код, есть две его фазы, первая из которых creation phase, на этом этапе синтаксический анализатор считывает код и выводит функцию и переменные, а вторая фаза - execution phase, в которой значения присваиваютсяпеременные,

Примечание: здесь функция хранится в памяти на этапе создания, так как именно там, где переменные поднимаются, но значенияне инициализирован (который будет назначен на этапе выполнения)

Компилятор будет обрабатывать ваш код следующим образом после подъема

function checkType() {
  var foo = function() {}; //hoisted function
  return foo;
  foo = 10;
  foo = 11;
};

console.log(typeof checkType(), '\nRturned value from function  --->', checkType())

Если вы определили свою функцию как переменную, то она будет только показана, но не будет инициализирована значением, вы можете увидеть приведенный ниже пример

function checkType() {
  return foo;
  foo = 10;

  var foo = function foo() {};
  var foo = 11;
};

console.log(typeof checkType(), '\nRturned value from function  --->', checkType())
...