#javascript #function-declaration #function-constructor
#javascript #объявление функции #функция-конструктор
Вопрос:
Я наткнулся на код, который выглядит следующим образом:
const tempFunc = exp => {
return new Function(`return ${exp}`)()
}
первый вопрос:
является ли это самостоятельным вызовом функции и ее возвратом ?.
что именно возвращает tempFunc?
второй вопрос: если мы вызовем функцию:
let result=tempFunc('3 2')
результат равен 5. как он преобразует строку и вычисляет результат?
Комментарии:
1. Это очень похоже на
eval
, но вычисляет одно выражение (из-заreturn
). ПРЕДУПРЕЖДЕНИЕ: эту вещь с одним выражением можно обойти, не используйте с небезопасным вводом!2. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
3. Здесь нет самостоятельного вызова.
Ответ №1:
При вызове tempFunc('3 2')
он возвращает new Function("return 3 2")()
, который создаст функцию ( function() { return 3 2 };
), а затем вызовет эту функцию.
И наоборот, если tempFunc
бы это выглядело так:
const tempFunc = exp => {
return new Function(`return ${exp}`);
}
Тогда она просто вернет новую функцию, которая не вызывается, и вам придется вызывать ее отдельно: tempFunc('3 2')();
Конструктор функций
Конструктор функции ( new Function()
) довольно интересен; вы можете в принципе указать ему, какие аргументы следует ожидать в качестве первых n аргументов, а последним аргументом является тело функции. В вашем примере нет аргументов для нашей новой функции, но мы могли бы создать такую, которая принимает аргументы:
const tempFunc = num => {
return new Function('x', `return x ${num}`)(2);
}
tempFunc(3);
// 5
Ответ №2:
В случае, если функции со стрелками вас смущают, вы также можете написать это примерно так:
const tempFunc = function(exp) {
const compiledFunc = new Function(`return ${exp}`)
return compiledFunc()
}
Это:
new Function(`return ${exp}`)
создает новый объект функции с отправленной строкой. Строка («3 2» в вашем примере) компилируется как функция, как если бы это был код javascript. Затем этот объект функции может быть вызван так, как если бы это была обычная функция javascript. Вот что делают два paranthesis в конце строки:
return new Function(`return ${exp}`)() // <-- these call it
Итак, если вы вызываете эту tempFunc, она запускает строку как код javascript и возвращает ее, очень похоже на то, что eval
делает.