Задерживает ли setTimeout создание функции? - PullRequest
0 голосов
/ 30 мая 2020

Это не работает, потому что, когда создается «журнал», а «сообщение» не существует.

function x() {
  function log() {
    console.log(message)
  }
  const message = "hello"
   log()
}

x()

Но это работает? setTimeout не знает об этом сообщении и, на мой взгляд, должен выдать ошибку. Но кажется, что "журнал" создается после того, как функция "x" завершена? Как это объясняется?

function x() {
  setTimeout(() => {
    console.log(message)
  }, 500)
  const message = "hello"
}

x()

Ответы [ 3 ]

0 голосов
/ 30 мая 2020

Я думаю, вы неправильно понимаете, что делает первый фрагмент кода.

Вы определяете функцию x, которая определяет внутри нее функцию log, а затем устанавливаете константу message to "hello";

Ни в одной точке фрагмента не вызывается функция log, поэтому console.log(message); никогда не вызывается.

Во втором фрагменте вы используете setTimeout для вызова функции, которая запустится через 500 мс.

0 голосов
/ 30 мая 2020

В первом примере вы не вызывали созданную вами функцию log(). Функция setTimeout работает, потому что она выполняет обратный вызов по истечении заданного времени.

function x() {
  function log() {
    console.log(message)
  }
  const message = "hello"

  log();
}

x()
0 голосов
/ 30 мая 2020

Это происходит из-за события l oop и того факта, что setTimeout принимает функцию обратного вызова в качестве аргумента.

В основном порядок операций ниже

  1. Определена функция с именем x
  2. Вызывается функция x
  3. Вызывается функция setTimeout
  4. Объявляется постоянная переменная с именем message
  5. Обратный вызов вызывается функция, переданная в качестве аргумента SetTimeout.
  6. Вызывается метод журнала объекта консоли.

Первый фрагмент кода не регистрируется в консоли, потому что вы не вызов функции, определенной в функции x. Вы можете записать переменную в консоль в первом фрагменте кода, обратившись к переменной через closure.

Это должно работать с первым фрагментом кода.

function x() {
  const message = "hello"
  return function() {
    console.log(message)
  }

}

x()()

Еще более простой Кстати, было бы просто вызвать функцию внутри функции:

function x() {
  function log() {
    console.log(message)
  }
  const message = "hello"
  log()
}

x()
...