Разница между новой функцией () и новой функцией () () - PullRequest
2 голосов
/ 21 июня 2019

Я наткнулся на некоторый код здесь , где конструктор Function вызывается интересным образом:

var jscriptVersion; // ...some code
jscriptVersion = new Function("/*@cc_on return @_jscript_version; @*/")();

Сначала я подумал, что дополнительные скобки были ошибкой, но после небольшого тестированияв консоли я подумал, что, возможно, это был ярлык для получения возвращаемого значения:

var a = new Function("return 'abc'");
var b = new Function("");
var c = new Function("")();
var d = new Function("return 'xyz'")();

console.log(a, typeof a);  // f anonymous() { return 'abc' } , function
console.log(b, typeof b);  // f anonymous() { } , function
console.log(c, typeof c);  // undefined , undefined
console.log(d, typeof d);  // xyz , string

Я предполагаю, что d (почти, кроме ключевого слова new) функционально идентичен:

var d2 = function() { return 'xyz' }(); console.log(d2); // xyz

Но, опять же, я буквально никогда не видел завершающих скобок после выражения функции, которое не является IIFE, и я удивлен, что код, определяющий d2, не приводит к ошибке SyntaxError.

Я посмотрел на MDN , но не смог найти четкую информацию о том, как это будет использоваться.

И действительно ли это JS или реализация двойных скобок в разных браузерах различается?

1 Ответ

2 голосов
/ 21 июня 2019

Завершающие скобки после new Function немедленно вызовут функцию. Это в основном то же самое, что и IIFE, за исключением того, что вызываемая функция динамически создается из переданной строки - new Function возвращает функцию, которая затем сразу запускается, если за ней следует ().

var a = new Function("return 'abc'");
var b = new Function("");
var c = new Function("")();
var d = new Function("return 'xyz'")();

console.log(a, typeof a);  // f anonymous() { return 'abc' } , function
                           // because that is the function that was constructed from the `return 'abc'` string
console.log(b, typeof b);  // f anonymous() { } , function
                           // because the string passed was empty, so the function returned from new Function is empty
console.log(c, typeof c);  // undefined , undefined
                           // because an empty function, when invoked, does not return anything:
                           // x = (() => {
                           // })();
                           // x is undefined
console.log(d, typeof d);  // xyz , string
                           // because the constructed function's body returns the `xyz` string
                           // and the constructed function was invoked immediately

Любая функция, которая возвращает функцию, может иметь () после ее вызова, а не только new Function или IIFE. Например:

const makeFn = arg => () => console.log(arg);

const fnThatLogs3 = makeFn(3);
fnThatLogs3();

makeFn(4)();
...