Давайте распакуем вещи одну за другой, сначала внутреннюю часть
function(a, b, c, d, e, f) {
//do some thing here and return value
}(val1, val2, val3, val4, val5, {})
На самом деле, давайте упростим это еще больше
(function() { //takes no paremeters
console.log("this was executed");
}())//no parameters given here
Это называется выражением немедленного вызова функции или очень часто сокращается до IIFE.Это довольно скучно, если честно, название - это полное описание, но позвольте мне перефразировать - это функция, которая объявляется и затем выполняется сразу.Это делается с помощью заключительных скобок ()
- точно так же, как если бы вы в противном случае выполняли функцию, например parseInt()
.В этом простом случае он просто печатает что-то на консоли и завершает работу.
Однако это нормальная функция, и она может выполнять все, что вам угодно, в том числе принимать параметры:
(function(param1, param2) { //takes two parameters
console.log("this was executed with parameters", param1, param2);
}("hello", "world"))//these are passed to the function
Итак, вы можете делать намного больше вещей.Вы даже можете вернуть значение, и параметры, передаваемые в функцию, могут быть переменными:
var someVariable = "hello";
var anotherVariable = "world";
var resultFromIIFE = (function(param1, param2) { //takes two parameters
console.log("this was executed with parameters", param1, param2);
return param1 + param2;
}(someVariable, anotherVariable));
console.log(resultFromIIFE);
Итак, надеюсь, это проясняет внутреннюю часть.Я вернусь к нему.
Что касается eval
- он принимает строку и выполняет ее как код JavaScript .
eval("console.log('this comes from eval()')");
var evalCanReturnResults = eval("1 + 2");
console.log(evalCanReturnResults);
var a = 3;
var b = 4;
var evalCanUseVariables = eval("a + b");
console.log(evalCanUseVariables);
Это быстрый ускоренный курс в eval
.Достаточно понять, что он может взять любую произвольную строку и выполнить ее как JS.
Итак, если мы сложим их вместе, внутренний IIFE, скорее всего, будет генерировать некоторый код динамически для выполнения eval
.Например, у вас может быть что-то вроде: *
eval(function(limit, toPrint) {
return "for (var i = 0; i < " + limit + "; i++) { console.log('" + toPrint + "') }"
}(3, "foo"))
, который сгенерирует цикл for
с указанными параметрами и выполнит его.