Function

Baseline 广泛可用 *

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

* 此特性的某些部分可能存在不同级别的支持。

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.js 中的顶层作用域不是全局作用域,x 将是模块的局部变量。

规范

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

浏览器兼容性

另见