我在网页上找到了该脚本:
eval(function(a, b, c, d, e, f) {
//do some thing here and return value
}(val1, val2, val3, val4, val5, {}))
您知道上面的表达实际上是什么吗?
答案 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)
这有两件事。
anonymous function
并执行它。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”,并将代码创建为新字符串,然后返回。此功能没有name
,anonymous
也没有。
使用参数hello
执行该功能。
然后使用eval
执行返回的代码(字符串形式)。
答案 2 :(得分:0)
eval
方法实际上是在执行eval
语句后立即用于执行脚本的。它可以执行string
格式的脚本。就像下面一样-
eval("console.log('hello world')")
在您的情况下,实际上只不过是在执行该语句后立即执行脚本。