Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

eval вызывается в локальной области видимости?

#javascript


global.a = 20;
var a = 10;

{
  let a = {};
  eval('a.member = 5');
}


Eval добавит свойство в объект a в этом же блоке? Или к глобальной?
Главный вопрос в том, что если несколько асинхронных функций будут вызывать такой
eval, то не будут ли они работать с одной и той же глобальной переменной?
    


Ответы

Ответ 1



https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/eval Прямой вызов eval - в локальной (с некоторыми оговорками). Непрямой в ES5+ - в глобальной. Непрямой в ES3 - любое поведение, в том числе бросание исключения. var x = {}; { let x = {}; // локальный скоуп eval("x.a = 1"); (eval)("x.b = 2"); // глобальный скоуп (1,eval)("x.k = 16"); window.eval("x.l = 17"); const e = eval; e("x.m = 18"); [eval][0]("x.n = 19"); eval.call(null, "x.o = 20"); console.log(x); } console.log(x); .as-console-wrapper.as-console-wrapper { max-height: 100vh } Уточнения про локальную область видимости: Переменные, объявленные внутри eval через let и const, не появляются в текущем скоупе. Переменные, объявленные внутри eval через var, а также функции, объявленные через function declaration, появляются в текущем скоупе только в нестрогом режиме. ~function () { eval("var a = 1"); eval("let b = 2"); eval("const c = 3"); eval("function d() {}"); console.log(typeof a, typeof b, typeof c, typeof d); }(); ~function () { 'use strict'; eval("var a = 1"); eval("let b = 2"); eval("const c = 3"); eval("function d() {}"); console.log(typeof a, typeof b, typeof c, typeof d); }();

Комментариев нет:

Отправить комментарий