2015-07-15 3 views
5

Одной из функций, предлагаемых ECMAScript 6, является возможность указывать значения по умолчанию для неуказанных параметров в JavaScript, например.Динамическое создание функции с параметрами по умолчанию в JavaScript

function foo(a = 2, b = 3) { 
    return a * b; 
} 

console.log(foo()); // 6 
console.log(foo(5)); // 15 

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

new Function('a = 2', 'b = 3', 'return a * b;'); 

Firefox 39, кажется, уже поддерживают параметры по умолчанию (see here) , но указанная выше строка отклоняется как синтаксическая ошибка.

+0

Хммм, почему вам нужен строковый аргумент вместо просто ' = 2'? Было бы немного сложнее в использовании, не так ли? –

+1

Это похоже на ошибку [this] (https://bugzilla.mozilla.org/show_bug.cgi?id=755821). – DavidDomain

ответ

0

Как new Function является формой Eval в любом случае вы можете использовать следующий код для выполнения этой задачи:

eval('function bar (a = 2, b = 3) { return a * b; }'); 
+0

Уход за пояснением @anonymous? – Dodekeract

+0

Наверное, потому что это объявление функции, поэтому 'eval' вернется undefined. Вместо этого вы должны использовать выражение функции. – Oriol

0

Я не знаю, если это должно работать - кто-то другой должен будет сказать вам, - но если это по-прежнему является проблемой, почему бы не использовать eval()?

Что-то в линиях на это должно быть законным:

var fct1 = eval("(function foo(a = 2, b = 3) { return a * b; })") 
1

Теперь мне интересно, если это возможно, чтобы использовать параметры по умолчанию и для функций, созданных динамически с помощью функции конструктора

Да, в соответствии с the spec это возможно. Аргументы параметров конкатенируются как всегда, а затем анализируются в соответствии с производством FormalParameters, который включает значения по умолчанию.

Firefox 39, похоже, уже поддерживает параметры по умолчанию, но указанная строка отклоняется как синтаксическая ошибка.

Ну, это ошибка :-) (вероятно this one)
Вы должны быть в состоянии работать вокруг него с помощью

var fn = Function('return function(a = 2, b = 3) { return a * b; }')();