🚞 JavaScript 创建函数 new Function
这是另一种 比较少用的 创建函数的方法: new Function
。
语法:
let func = new Function ([arg1, arg2, ...argN], functionBody);
1
通过使用给定的 参数
arg ...
和 函数体functionBody
字符串创建函数。
🌰 例子:
let sum = new Function('a', 'b', 'return a + b');
console.log(sum(1, 2)); // 3
1
2
3
2
3
🌰 例子 / 没有参数的函数:
let sayHi = new Function('alert("Hello")');
sayHi()
1
2
3
2
3
这种创建函数的方法与已知的创建函数方法最大的不同在于,它实际上是通过运行时 通过参数传递过来的字符串 创建的。
以往函数都要在脚本中编写并调用。 new Function
允许将任意字符串变为函数。意味着可以从服务器中接受一个 字符串 创建新的函数并执行它。
🌰 例子:
let str = '...' // 动态地接收来自服务器的代码 ...
let func = new Function(str);
func();
1
2
3
4
2
3
4
使用
new Function
创建函数的应用场景非常特殊,比如在复杂需要从服务器 获取代码 或者 动态地从模板编译函数时 才会使用。
# 闭包
使用 new Function
创建一个函数,那么该函数的 [[Environment]]
并不指向当前的词法环境,而是指向全局环境。
因此,此类函数无法访问外部变量,只能访问全局变量。这有助于降低我们代码出错的可能。并且,从代码架构上讲,显式地使用参数传值是一种更好的方法,并且避免了与使用压缩程序而产生冲突的问题。
🌰 例子:
function getFunc() {
let value = "test";
let func = new Function('alert(value)');
return func;
}
getFunc()() // Error: value is not defined
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
与常规的函数声明对比:
function getFunc() { let value = "test"; let func = function() { alert(value); }; return func; } getFunc()(); // test
1
2
3
4
5
6
7
8
9
编辑 (opens new window)
📢 上次更新: 2022/09/02, 10:18:16