Eval () - javascript, mdn

значення, що повертається

Повертає значення виконання коду, переданого в функцію у вигляді рядка. Якщо код не повертає нічого - буде повернуто значення undefined.

eval () - функція глобального об'єкта.

eval () можна використовувати для обчислення значення арифметичного виразу, записаного в строковому вигляді, на більш пізній стадії виконання. Припустимо, існує змінна x. Можна відкласти обчислення виразу, в якому міститься х. якщо привласнити змінної цей вислів у вигляді рядка (припустимо, "3 * x + 2"), а потім викликати eval () в пізнішій точці коду.

Якщо аргумент, переданий eval (). не є рядком, eval () повертає його незмінним. У наступному прикладі визначений конструктор String. і eval () не вирахував значення виразу, записаного в строковому вигляді, а повертає об'єкт типу String.

Це обмеження легко обійти за допомогою toString ().

Якщо ви використовуєте eval побічно, викликом його через посилання, а не просто eval, в ECMAScript 5 це працює в глобальному контексті, а не в локальній; це означає eval буде викликаний в глобальному контексті, а код буде виконаний з відсутньою доступу до локальних змінних в межах області видимості, де він була викликана.

eval () - небезпечна функція, яка виконує код, що проходить з усіма привілеями визиватель. Якщо ви запускаєте eval () з рядком, на яку можуть впливати зловмисники, то ви можете запустити шкідливий код на пристроїв користувача з правами вашої веб-сторінки / розширення. Найбільш важливо, код третьої сторони може бачити область видимості, в якій був викликаний eval (). що може може привести до атак, схожим на Function.

Також eval (), як правило, повільніше альтернатив, тому що викликає інтерпретатор JS, тоді як багато інших конструкції оптимізовані сучасними JS двигунами.

Є безпечні (і швидкі!) Альтернативи eval () для загальних випадків використання.

Доступ до властивостей

Вам не слід використовувати eval (). конвертувати імена властивостей в властивості. Розглядаючи наступний приклад, де властивість об'єкта використовується для доступу невідомо до виконання коду. Це можна зробити з eval:

Однак, eval () тут не потрібен. За фактом, використання тут його дивує. Замість нього використовуйте доступ до властивостей. який швидше і безпечніше:

Використовуйте функції замість виконання фрагментів коду

Замикання також корисні як спосіб створення функцій з параметрами без конкатенації рядків.

Передавайте дані замість коду

Наприклад, розширення створене змінювати вміст веб-сторінок дожно мати правила, певні в XPath. а не JS коді.

Виконуйте код з обмеженими правами

Якщо необхідно виконати код, розглядаючи його запуск з збільшеними привелегиями. Ця рада застосовується, головним чином, до розширень і XUL додатків, які можуть використовувати Components.utils.evalInSandbox для цього.

Використання eval

У наступному коді обидва вирази містять eval (), який повертає 42. Перше визначається рядком "x + y + 1"; друге - рядок "42".

Останній вираз виконується

eval () поверне значення останнього виконуваного вираження

eval як строкове визначення функції, у тому числі "(" і ")" як префікс і суфікс

специфікації

Дякуємо! Будь ласка, перевірте свою папку "Вхідні" для підтвердження підписки.

Якщо ви раніше не підтверджували підписку на розсилку новин Mozilla, то вам, можливо, доведеться зробити це. Будь ласка, перевірте папку Вхідні або Спам в своїй поштовій скриньці, щоб подивитися, чи не настав від нас лист.

Приховати підписку на розсилку новин

Чому MDN виглядає інакше?

MDN змінюється, фокусуючись тільки на документуванні веб-технологій. Все той же відмінний контент залишиться тут; ми міняємо тільки візуальні елементи і навігацію, щоб допомогти вам швидше знаходити документацію по веб-технологіям.

Але не хвилюйтеся, MDN і Mozilla як і раніше разом. За фактом, ми оновлюємо тільки оформлення MDN, щоб відповідати новому лого і квітам Mozilla.

Прочитайте більше про редизайн в пості на нашому блозі. Дякуємо за використання MDN!

Приховати повідомлення про редизайн