表达式eval(function(){}())在javascript中做什么?

时间:2019-03-02 12:29:32

标签: javascript function eval

我在网页上找到了该脚本:

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

您知道上面的表达实际上是什么吗?

3 个答案:

答案 0 :(得分:2)

我们先一步一步地拆开包装

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

这称为an immediately invoked function expression或通常简称为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,它需要一个 string 并将其作为 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循环并执行它。

答案 1 :(得分:1)

这有两件事。

  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')
)

定义一个函数,该函数接受字符串,添加“ world”,并将代码创建为新字符串,然后返回。此功能没有nameanonymous也没有。

使用参数hello执行该功能。

然后使用eval执行返回的代码(字符串形式)。

答案 2 :(得分:0)

eval方法实际上是在执行eval语句后立即用于执行脚本的。它可以执行string格式的脚本。就像下面一样-

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

在您的情况下,实际上只不过是在执行该语句后立即执行脚本。