Javascript альтернатива eval () - PullRequest
       19

Javascript альтернатива eval ()

0 голосов
/ 22 сентября 2018

eval () делает именно то, что я хочу, но когда я смотрю на документ в MDN, он говорит:

Никогда не используйте eval!eval () - опасная функция, которая выполняет код, переданный с привилегиями вызывающей стороны.Если вы запустите eval () со строкой, на которую может повлиять злоумышленник, вы можете в конечном итоге запустить вредоносный код на компьютере пользователя с разрешениями вашей веб-страницы / расширения.Что еще более важно, сторонний код может видеть область, в которой был вызван eval (), что может привести к возможным атакам таким образом, что подобная функция не восприимчива.

eval () также медленнее, чемальтернативы, поскольку он должен вызывать интерпретатор JS, в то время как многие другие конструкции оптимизируются современными механизмами JS.

Кроме того, современные интерпретаторы javascript преобразуют JavaScript в машинный код.Это означает, что любая концепция именования переменных стирается.Таким образом, любое использование eval заставит браузер долго искать дорогие имена переменных, чтобы выяснить, где переменная существует в машинном коде, и установить ее значение.Кроме того, с помощью eval () можно вводить новые вещи в эту переменную, такие как изменение типа этой переменной, вынуждая браузер переоценивать весь сгенерированный машинный код для компенсации.Однако (к счастью) существует очень хорошая альтернатива eval: просто использование window.Function.В качестве примера того, как вы конвертируете код с помощью evil eval () в функцию Function ().

, что для меня лучше.мой код выглядит так:

let aCount=0;
let bCount=0;

addCount=(option)=>{ //option either a or b
    const choice=eval(option+"Count"); // then combine to aCount or bCount
    choice++;
}

addCount(a);//aCount=1;
addCount(a);//aCount=2;
addCount(b);//bCount=1;
addCount(b);//bCount=2;

я пробую окно [переменную] раньше, но оно не возвращает значение, я не могу сделать что-то вроде

const choice=window[option+"Count"]

, оно вернет неопределенное.и мне нужно многократно вызывать выбор, чтобы мне не повторилось окно [переменная].

1 Ответ

0 голосов
/ 22 сентября 2018

Помимо "eval", в вашем примере кода есть некоторая ошибка, и я не собираюсь объяснять вам.

И теперь мы сосредоточимся на "eval" в вашем примере.Если вы сделаете это, вы обнаружите, что это не будет работать вообще.Вы можете сделать это только как eval(option + "Count++"), а не присваивать значение aCount / bCount переменной (CONST!), А затем увеличивать эту переменную.Следующий код имеет логическую проблему:

let c = aCount;
c++; // aCount not changed

По моему мнению, вы можете использовать «eval» в некоторых особых ситуациях, если код, переданный в «eval», АБСОЛЮТНО доверен.В вашем примере кода это соответствует этому правилу.(Однако, помимо безопасности, у «eval» также есть проблема с производительностью.)

Конечно, у вас есть другие лучшие варианты, чтобы избежать использования «eval».Например, используйте if / else или switch / case:

addCount=(option)=>{
    if (option === 'a') aCount++;
    else if (option === 'b') bCount++;
}

Или вы можете использовать объект для хранения всех переменных:

let obj = {aCount: 0, bCount: 0};
addCount=(option)=>{
    obj[option + "Count"]++;
}
...