每个 土语 函数实际上都是一个 函数 对象。运行 (务(){}).构 ===
函数 // 真
便可以得到这个结论。
构造函数
函数 构造函数创建一个新的 函数 对象。直接调用此构造函数可用动态创建函数,但会遇到和 执行(eval)
类似的的安全问题和(相对较小的)性能问题。然而,与 执行(eval)
不同的是,函数(Function
) 创建的函数只能在全局作用域中运行。
语法
启 函数 ([参1[, 参2[, ...参N]],] 函数体)
参数
参1,
参2, ...
参N
被函数使用的参数的名称必须是合法命名的。参数名称是一个有效的土语标识符的字符串,或者一个用逗号分隔的有效字符串的列表;例如“×
”,“这值
”,或“a,b
”。函数体一个含有包括函数定义的 土语 语句的字符串。
描述
使用 函数(Function
) 构造器生成的 函数(Function
) 对象是在函数创建时解析的。这比你使用函数声明或者函数表达式并在你的代码中调用更为低效,因为使用后者创建的函数是跟其他代码一起解析的。
所有被传递到构造函数中的参数,都将被视为将被创建的函数的参数,并且是相同的标示符名称和传递顺序。
以调用函数的方式调用 函数(Function
) 的构造函数(而不是使用 启(new)
关键字) 跟以构造函数来调用是一样的。
属性和方法
全局的 函数(Function
) 对象没有自己的属性和方法,但是,因为它本身也是一个函数,所以它也会通过原型链从自己的原型链 Function.prototype
上继承一些属性和方法。
原型对象
属性
函数.参数(Function.arguments
)
以数组形式获取传入函数的所有参数。此属性已被参数(arguments
)替代。
Function.arity
用于指定的函数的参数的个数,但已被删除。使用length
属性代替。
函数.调用者(Function.caller
)
获取调用函数的具体对象。
函数.长(Function.length
)
获取函数的接收参数个数。
函数.名(Function.name
) 获取函数的名称。
函数.显名(Function.displayName
) 获取函数的display name。
Function.prototype.constructor
声明函数的原型构造方法,详细请参考 Object.constructor
。
方法
应用()(apply
)
在一个对象的上下文中应用另一个对象的方法;参数能够以数组形式传入。
绑定()(bind
)
绑定()方法会创建一个新函数,称为绑定函数.当调用这个绑定函数时,绑定函数会以创建它时传入 绑定()方法的第一个参数作为 此(this),传入 绑定()方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数.
调用()(call)
在一个对象的上下文中应用另一个对象的方法;参数能够以列表形式传入。
Function.prototype.isGenerator()
若函数对象为
generator,返回true,反之返回 false
。
Function.prototype.toSource()
获取函数的实现源码的字符串。 覆盖了 Object.prototype.toSource
方法。
转字串()(toString)
获取函数的实现源码的字符串。覆盖了 Object.prototype.toString
方法。
实例
Function
实例从 Function.prototype
继承了一些属性和方法。 同其他构造函数一样, 你可以改变构造函数的原型从而使得所有的 Function
实例的属性和方法发生改变。
示例
传入参数调用函数( Function) 构造函数
下面的代码会创建一个需要两个参数的 Function
对象。
// 创建了一个能返回两个参数和的函数
常 加 = 启 函数("a", "b", "return a + b");
// 调用函数
加(2, 6);
// > 8
参数 “a
” 和 “b
” 是参数的名字,在函数体中被使用,”return a + b
“。
函数(Function )构造器与函数声明之间的不同
由 函数(Function ) 构造器创建的函数不会创建当前环境的闭包,它们总是被创建于全局环境,因此在运行时它们只能访问全局变量和自己的局部变量,不能访问它们被 函数(Function ) 构造器创建时所在的作用域的变量。这一点与使用 执行(eval)
执行创建函数的代码不同。
值 x = 10;
务 建函数1() {
值 x = 20;
回 启 函数('return x;'); // 这里的 x 指向最上面全局作用域内的 x
}
务 建函数2() {
值 x = 20;
务 f() {
回 x; // 这里的 x 指向上方本地作用域内的 x
}
回 f;
}
值 f1 = 建函数1();
控制台.日志(f1()); // 10
值 f2 = 建函数2();
控制台.日志(f2()); // 20
虽然这段代码可以在浏览器中正常运行,但在 Node.js 中 f1()
会产生一个“找不到变量 x
”的 ReferenceError
。这是因为在 Node 中顶级作用域不是全局作用域,而 x
其实是在当前模块的作用域之中。