Интервал использования с arguments.callee прерывает поведение "require"

Я довольно смущен, почему некоторые "требуют"

возвращает ошибку:

Ошибка типа: require не является функцией в Timeout._onTimeout (...........index.js:8:18)

Когда выполняется следующее:

(()=> {
  console.time("pipeline")
  pipeline().then((result) => {
    console.log("Then: " + result)
    console.log("Work Complete for iteration: " + i + " calling iteration no:", i = i + 1)
    setTimeout(arguments.callee, 1000);
  }).catch((error) => {
    console.error("error occured with promise resolution: " + error)
  });
  console.timeEnd("pipeline")
})()

он запускается один раз, затем ошибки (хотя я, очевидно, подключен к БД)

но работает, как и ожидалось, при изменении на этот формат:

(function () {
  console.time("pipeline")
  pipeline().then((result) => {
    console.log("Then: " + result)
    console.log("Work Complete for iteration: " + i + " calling iteration no:", i = i + 1)
    setTimeout(arguments.callee, 1000);
  }).catch((error) => {
    console.error("error occured with promise resolution: " + error)
  });
  console.timeEnd("pipeline")
})()

Ошибка предполагает, что это связано с тайм-аутом, который я думаю, потому что он выполняется один раз, прежде чем выдать ошибку.

Почему происходит такое поведение? Это относится к arguments.callee и если да, то почему?

Заранее спасибо,

1 ответ

Решение

arguments ссылается на область родительской функции в случае функции стрелки. Функции стрелок не имеют собственныхarguments,

Модули Node.js обернуты с помощью функции обертки модулей под капотом:

(function(exports, require, module, __filename, __dirname) {
// Module code actually lives in here
});

Это то, что arguments.callee относится к внутренней функции стрелки. призвание arguments.callee приводит к повторной оценке текущего модуля с неверными аргументами, require особенно.

Надеется arguments.callee взломан Лучший способ сделать это - явно обратиться к функции:

(function foo() {
  ...
  setTimeout(foo, 1000);
  ...
})()

В то время как стрелка потребует, чтобы область видимости блока не просочилась foo в родительскую область:

{
  let foo;
  (foo = () => {
    ...
    setTimeout(foo, 1000);
    ...
  })()
}
Другие вопросы по тегам