函数
**Function
** 对象提供了用于 函数 的方法。在 JavaScript 中,每个函数实际上都是一个 Function
对象。
构造函数
Function()
-
创建一个新的
Function
对象。直接调用构造函数可以动态创建函数,但存在安全问题,并且类似于(但远不如)eval()
的性能问题。但是,与eval()
不同,Function
构造函数创建的函数仅在全局范围内执行。
实例属性
这些属性在 Function.prototype
上定义,并由所有 Function
实例共享。
Function.prototype.arguments
已弃用 非标准-
表示传递给此函数的参数。对于 严格、箭头、异步和生成器函数,访问
arguments
属性会抛出TypeError
。请改用函数闭包内部的arguments
对象。 Function.prototype.caller
已弃用 非标准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()
用于函数表达式的代码不同。
// 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 表格仅在浏览器中加载