目录

🚞 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

🌰 例子 / 没有参数的函数:

let sayHi = new Function('alert("Hello")');

sayHi()
1
2
3

这种创建函数的方法与已知的创建函数方法最大的不同在于,它实际上是通过运行时 通过参数传递过来的字符串 创建的。

以往函数都要在脚本中编写并调用。 new Function 允许将任意字符串变为函数。意味着可以从服务器中接受一个 字符串 创建新的函数并执行它。

🌰 例子:

let str = '...' // 动态地接收来自服务器的代码 ...

let func = new Function(str);
func();
1
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

与常规的函数声明对比:

function getFunc() {
  let value = "test";

  let func = function() { alert(value); };

  return func;
}

getFunc()(); // test
1
2
3
4
5
6
7
8
9
📢 上次更新: 2022/09/02, 10:18:16