При вызове внутри функции с параметрами, передаваемыми из parent, почему запись в функцию setTimeout не определена? - PullRequest
0 голосов
/ 17 июня 2019

Я работал с асинхронной функцией setTimeout в javascript.Следующий код дает разные результаты, когда параметр передается в одной функции setTimeout, а не в другой.Может кто-нибудь объяснить это?

Код 1:

console.log("Before");
getUserId(2);
console.log("After");

function getUserId(id){
  setTimeout(() =>{
    console.log(id);
  }, 2000);
}

Выход 1:

Before
After
2

и,

Код 2:

console.log("Before");
getUserId(2);
console.log("After");

function getUserId(id){
  setTimeout((id) =>{
    console.log(id);
  }, 2000);
}

Выход 2:

Before
After
undefined

Ответы [ 4 ]

1 голос
/ 17 июня 2019

Параметр id внутри обратного вызова setTimeout будет неопределенным, если вы не назначите ему значение по умолчанию , как в примере

function parentMethod(parentId) {
  setTimeout((id = parentId) => {
    console.log(id);
  }, 2000);
}

Проверьте эту строку setTimeout((id = parentId) => {

Здесь я присваиваю ему значение по умолчанию, поэтому он будет регистрировать все, что я назначаю родительскому методу.

1 голос
/ 17 июня 2019

Если вы хотите передать параметры в callback, вы можете поставить их после delay param.Если вы не передаете никаких параметров, ваш обратный вызов вызывается без

setTimeout(function[, delay, param1, param2, ...]);

console.log("Before");
getUserId(2);
console.log("After");

function getUserId(id){
  setTimeout((id) =>{
    console.log(id);
  }, 100, id);
}
0 голосов
/ 17 июня 2019

Во втором примере вы переопределяете область для переменной id в обратном вызове, переданном setTimeout(). Другими словами, это так же, как:

function getUserId(id){
  setTimeout((some_other_id) => {
    console.log(some_other_id);
    // some_other_id is undefined
  }, 2000);
}

Понимание области применения id объяснит / решит вашу проблему.

0 голосов
/ 17 июня 2019

Поскольку в примере 1 идентификатор установлен в области действия getUserId (id) В примере 2 идентификатор снова устанавливается в этой области, но затем с помощью вашей анонимной функции был создан второй более узкий идентификатор области. нет необходимости передавать setTimeout () параметр id, так как он уже существует в области действия getUserId

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...