Итак, я собираюсь ответить на свой вопрос здесь (так как я понял это).
Моя первоначальная предпосылка заключалась в том, что оба блока кода эквивалентны. Так что это
var f = function ( eval ) {};
эквивалентно
var f = new Function( 'eval', '' );
Однако это не так. Есть различия. Создание объекта-функции из нотации объявления/выражения функции описано в Главе 13.2 Создание объектов-функций. С другой стороны, создание объекта функции из вызова конструктора new Function
описано в главе 15.3. 2.1 новая функция (p1, p2, … , pn, body). Так что здесь работают разные алгоритмы.
Конкретная часть, имеющая отношение к этому вопросу, - это часть, которая определяет строгость созданного функционального объекта.
Выражения функций
Строгость функционального объекта, созданного с помощью функционального выражения, определяется в семантике создания FunctionExpression в начале главы 13:
Передайте true как флаг Strict, если FunctionExpression содержится в строгом коде или если его FunctionBody является строгим кодом.
Таким образом, объект функции будет строгим, если выполняется любое из этих условий:
- выражение функции содержится в строгом коде
- тело функции выражения функции является строгим кодом
так, например, функция f
является строгой в обоих приведенных ниже примерах.
Пример 1:
(function () {
var f = function () {
'use strict';
return 'I am strict!';
}
})();
Пример 2:
(function () {
'use strict';
var f = function () {
return 'I am strict!';
}
})();
Вызов конструктора функции
Строгость объекта функции, созданного с помощью вызова конструктора функции, определяется на шаге 9 алгоритма из главы 15.3.2.1 (уже ссылка выше):
Если тело является кодом строгого режима (см. 10.1.1), тогда пусть strict будет истинным, иначе пусть strict будет ложным.
Таким образом, не имеет значения, содержится ли вызов new Function
в строгом коде. Чтобы создать строгую функцию с помощью этого шаблона, необходимо явно определить строгость в теле функции (это последний аргумент, передаваемый конструктору.
new Function ( 'a, b', 'return a + b;' ); // not strict
new Function ( 'a, b', '"use strict"; return a + b;' ); // strict
person
Šime Vidas
schedule
11.12.2011
new Function(...)
выполняется в глобальном коде (ее область действия является глобальной областью действия), к ней не применяется строгое правило использования. Это оно? - person Šime Vidas   schedule 10.12.2011'use strict'
на глобальном уровне, создание такой функции должно наследовать строгий режим. Поскольку формальный параметрeval
находится в новой среде функции (он не является глобальным), кажется, что вы должны получить ошибку. - person RightSaidFred   schedule 11.12.2011var f = new Function( 'eval', '"use strict";' );
вы получаете ошибку. Но не с этим:"use strict"; var f = new Function( 'eval', ';' );
Кажется, это неправильно. - person RightSaidFred   schedule 11.12.2011eval( 'var f = function( eval ) { ; }' );
также дает вам ошибку. - person RightSaidFred   schedule 11.12.2011