как определить функцию внутри функции в javascript?

89
11

Я хочу объявить функцию внутри функции. Я делаю это так:

var expr = "'use strict';
console.log('a')";
var f = Function('"use strict";var t = Function('+expr+');');
f();

Я получаю следующее сообщение об ошибке: Uncaught SyntaxError: Неожиданный токен ';' Вот ссылка на jsbin. Мне нужно создать функцию с функцией внутри функции, а не вложенные функции, а eval - здесь. Я заметил, что что-либо в переменной expr обрабатывается некорректно. Я имею в виду любой код, который я там помещал. Поэтому я не могу вставить даже переменную деликатацию внутри. Btw, если я иду с одним утверждением, например

console.log('a');

он отлично работает и создает ожидаемый а в консоли.

Причина, по которой мне нужно использовать функцию, - это то, что я хочу проверить, как работает строгий режим. Как и в случае с спецификацией ecmascript (10.1.1. Строгий режимный код), этот код находится в строгом режиме, если он начинается с пролога "строгого использования" или в строгом режиме. Поэтому я хочу проверить, как функция внутри функции будет вести себя с точки зрения строгого кода.

Как я узнал, функция внутри функции не имеет такого же строго режима. Вот пример jsbin. переменная не объявлена и ее штраф. Попробуйте добавить "use strict", и вы увидите сообщение об ошибке. Для получения более подробной информации, пожалуйста, взгляните на последний пункт в этом списке

спросил(а) 2021-01-25T13:03:16+03:00 4 месяца, 4 недели назад
1
Решение
89

Помимо того факта, что эту конструкцию следует действительно избегать (она медленная, это может быть опасно, если вы не уверены в происхождении ваших строк и, конечно, иметь дело с кавычками, больно), у вас есть три проблемы:

    плохой строковый литерал вы не называете внутреннюю функцию вам не хватает кавычек вокруг тела внутренней функции

Здесь "фиксированная" версия:

var expr = "'use strict';\
console.log('a')";
var f = Function('"use strict";var t = Function("'+expr+'");t();');
f();

ответил(а) 2021-01-25T13:03:16+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема