Что делает выражение eval (function () {} ()) в javascript? - PullRequest
0 голосов
/ 02 марта 2019

Я нашел этот скрипт на веб-странице:

eval(function(a, b, c, d, e, f) {
    //do some thing here and return value
}(val1, val2, val3, val4, val5, {}))

Вы знаете, что на самом деле делает вышеприведенное выражение?

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Это делает 2 вещи.

  1. Создает anonymous function и выполняет его.
  2. eval результаты функции.

Вот упрощенный пример.

eval(
  function(a) {
    let str = a + ' world'
    let toEval = 'console.log("' + str + '")'
    // the string is now -> 'console.log("hello world")'
    return toEval
  }('hello')
)

Определяет функцию, которая принимает строку, добавляет «мир» и создает код в виде новой строки, а затем возвращает ее.Эта функция не имеет name, как и anonymous.

Выполняет функцию с параметром hello.

Затем выполняет возвращенный код (в виде строки), используя eval.

0 голосов
/ 02 марта 2019

Давайте распакуем вещи одну за другой, сначала внутреннюю часть

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 с указанными параметрами и выполнит его.

0 голосов
/ 02 марта 2019
Метод

eval фактически используется для выполнения сценариев, как только выполняется оператор eval.Может выполнять скрипт в формате string.Как показано ниже -

eval("console.log('hello world')")

В вашем случае это на самом деле не что иное, как выполнение сценария сразу после выполнения этого оператора.

...