函数

**Function** 对象提供了用于 函数 的方法。在 JavaScript 中,每个函数实际上都是一个 Function 对象。

构造函数

Function()

创建一个新的 Function 对象。直接调用构造函数可以动态创建函数,但存在安全问题,并且类似于(但远不如)eval() 的性能问题。但是,与 eval() 不同,Function 构造函数创建的函数仅在全局范围内执行。

实例属性

这些属性在 Function.prototype 上定义,并由所有 Function 实例共享。

Function.prototype.arguments 已弃用 非标准

表示传递给此函数的参数。对于 严格、箭头、异步和生成器函数,访问 arguments 属性会抛出 TypeError。请改用函数闭包内部的 arguments 对象。

Function.prototype.caller 已弃用 非标准

表示调用此函数的函数。对于 严格、箭头、异步和生成器函数,访问 caller 属性会抛出 TypeError

Function.prototype.constructor

创建实例对象的构造函数。对于 Function 实例,初始值为 Function 构造函数。

这些属性是每个 Function 实例的自身属性。

displayName 非标准 可选

函数的显示名称。

length

指定函数期望的参数数量。

name

函数的名称。

prototype

在函数用作带有 new 运算符的构造函数时使用。它将成为新对象的原型。

实例方法

Function.prototype.apply()

使用给定的 this 值和可选参数(作为数组或 类数组对象 提供)调用函数。

Function.prototype.bind()

创建一个新函数,当调用该函数时,其 this 关键字设置为提供的值,可选地,在调用新函数时,可以使用给定的参数序列作为前缀。

Function.prototype.call()

使用给定的 this 值和可选参数调用函数。

Function.prototype.toString()

返回表示函数源代码的字符串。覆盖 Object.prototype.toString 方法。

Function.prototype[Symbol.hasInstance]()

指定用于确定构造函数是否识别对象为构造函数的实例之一的默认过程。由 instanceof 运算符调用。

示例

Function 构造函数和函数声明之间的区别

使用 Function 构造函数创建的函数不会创建对其创建上下文的闭包;它们始终在全局范围内创建。在运行它们时,它们只能访问自己的局部变量和全局变量,而不能访问创建 Function 构造函数的范围中的变量。这与使用 eval() 用于函数表达式的代码不同。

js
// Create a global property with `var`
var x = 10;

function createFunction1() {
  const x = 20;
  return new Function("return x;"); // this `x` refers to global `x`
}

function createFunction2() {
  const x = 20;
  function f() {
    return x; // this `x` refers to the local `x` above
  }
  return f;
}

const f1 = createFunction1();
console.log(f1()); // 10
const f2 = createFunction2();
console.log(f2()); // 20

虽然此代码在 Web 浏览器中有效,但在 Node.js 中,f1() 将产生 ReferenceError,因为找不到 x。这是因为 Node 中的顶层范围不是全局范围,x 将是模块的局部范围。

规范

规范
ECMAScript 语言规范
# sec-function-objects

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅