javascript 什么是typeScript中的函数构造函数?

ogsagwnx  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(127)

我在看Typescript Ecmascript的源代码,我看到了这个:

interface FunctionConstructor {
    /**
     * Creates a new function.
     * @param args A list of arguments the function accepts.
     */
    new(...args: string[]): Function;
    (...args: string[]): Function;
    readonly prototype: Function;
}

declare var Function: FunctionConstructor;

我假设FunctionConstructor是Function的构造函数的类型。
我们声明了一个Function变量,它有FunctionConstructor接口。FunctionConstructor接口的前两个参数是什么?为什么变量Function(一个从Object派生的普通JavaScript对象)的类型与它的构造函数相似?
基本上我正在努力了解幕后发生的事情。任何帮助都是感激的。谢谢!

5us2dqdw

5us2dqdw1#

首先参见Function() constructor
Function()构造函数创建了一个新的Function对象。直接调用构造函数可以动态创建函数,但会遇到与eval()类似的安全性和性能问题(但远没有eval()那么重要)。然而,与eval(可以访问局部作用域)不同,Function构造函数创建的函数只能在全局作用域中执行。

const sum = new Function('a', 'b', 'return a + b');

console.log(sum(2, 6));
// Expected output: 8

换句话说:动态创建函数是一个高级特性。2如果可能,使用常规函数。
话虽如此:
记住变量和类型使用不同的命名空间。
此代码法律的

interface Foo {
  id: number
}

var Foo = 1;

因此,var Function: FunctionConstructor是可用于产生Function对象的对象。
接口FunctionConstructor对如何使用Function对象进行建模:

  • 使用new创建函数
// using new(...args: string[]): Function;
const sum = new Function('a', 'b', 'return a + b');
console.log(sum(2, 6));
  • 创建不带new的函数
// using (...args: string[]): Function;
const sum = Function('a', 'b', 'return a + b');
console.log(sum(2, 6));

prototype: Function是JS中原型继承的标志,通过Function对象创建的对象将其__proto__设置为Function类型的对象,从而可以使用该类型的方法(可以调用etc)。

const sum = Function('a', 'b', 'return a + b');
console.log(sum(2, 6));

console.log(Function.prototype === sum.__proto__) // true

相关问题