Function
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
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
-
在使用
function
作为构造函数与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()
执行创建函数的代码不同。
// 使用 `var` 创建一个全局属性
var x = 10;
function createFunction1() {
const x = 20;
return new Function("return x;"); // 这个 `x` 指的是全局 `x`
}
function createFunction2() {
const x = 20;
function f() {
return x; // 这个 `x` 指的是上面的局部 `x`
}
return f;
}
const f1 = createFunction1();
console.log(f1()); // 10
const f2 = createFunction2();
console.log(f2()); // 20
虽然这段代码可以在浏览器中正常运行,但在 Node.js 中 f1()
会产生一个“找不到变量 x
”的 ReferenceError
。这是因为在 Node 中顶级作用域不是全局作用域,而 x
其实是在当前模块的作用域之中。
规范
Specification |
---|
ECMAScript Language Specification # sec-function-objects |
浏览器兼容性
BCD tables only load in the browser