eval вызывается косвенно, но появляется ошибка - PullRequest
0 голосов
/ 26 декабря 2018

Поместите код в файл (test.js), затем выполните node test.js.Вы получите:

ReferenceError: val не определено

Если вы копируете код непосредственно в среде узла (или консоли браузера), об ошибке не сообщается.

let val = "global"

function foo2() {
    let val = "local"
    let f = eval
    return f("val")
}
foo2()

1 Ответ

0 голосов
/ 26 декабря 2018

Если вы прочитаете страницу MDN на eval, вы увидите:

, если вы используете функцию eval косвенно, вызывая ее по ссылке, отличной от evalНачиная с ECMAScript 5 он работает в глобальной области, а не в локальной области.

Когда вы запустите этот код в Node, он будет искать в глобальном объекте val и не найдетэто потому, что даже переменные, объявленные во внешней области видимости, являются частными для включающего модуля в Node - они не попадают в глобальное пространство имен, если вы не поместите их туда.Это вызывает ошибку, которую вы заметили.

Это, однако, будет регистрировать global в узле:

global['val'] = "global"

function foo2() {
  let val = "local"
  let f = eval
  return f("val")
}
console.log(foo2())
...