在js中,经常会使用到函数,普通函数虽然很方便,但是,形式略显复杂,特别是代码量大的时候,这时,我们可以使用动态函数,动态函数形式比较简洁,并且比普通函数表达式更灵活,其结构如下:
var fun_name=new Function(x1,x2,x3,...,fun_body)
这里需要注意的是,....表示的是省略,可以作为伪代码来看,并且,Function不能写成function,不然会报错,我们可以对比一下:
var fun1 = new Function("num1","num2","return num1+num2");
console.log(fun1(12,2))
运行结果:14
结果正确,我们换成function:
var fun1 = new function("num1","num2","return num1+num2");
console.log(fun1(12,2))
运行结果:
Uncaught SyntaxError: Unexpected string
果然报错了,这里就需要了解到function 和Function的区别,这篇博客(https://blog.csdn.net/kinseygeek/article/details/68280828)详细地查了英文文档,给了我们解答。function是用于声明函数时用的,而Function是 constructor,里面需要传的是string,刚才的尝试中,显然我们并不是声明函数。而且我们传入的参数必须以字符串的形式进行,我们尝试一下:
var fun1 = new Function(num1,num2,return num1+num2);
console.log(fun1(12,2))
运行结果:
Uncaught SyntaxError: Unexpected token return
因此我们在使用Function的时候,必须传入string的形式。
关于动态函数中的fun_body,到底什么形式的才算fun_body呢?此表达式只要参与运算就行吗?答案当然不是,因为函数必须要有返回值,没有返回值的运算是没有作用的,我们可以看下:
var fun1 = new Function("num1","num2","num1+num2");
console.log(fun1(12,2))
我们的fun_body里使用了运算符“+”,实际上并没有什么卵用,得不到结果,会出现:
undefined
我大胆地进行猜测,这是因为没有识别到fun_body吗。我们尝试一下:
var fun1 = new Function("num1","num2","num1+num2");
运行结果为空白,没有报错。
说明我们的猜测是对的。这问题等价于“num1+num2"也作为参数了,没有fun_body。说明fun_body是可以省略但是这样做没有实际价值。