函数实际上是功能完整的对象,所有函数都应看作 Function 类的实例,Function 类可以表示开发者定义的任何函数。
1. 创建
第一种方式:
<script>
//函数名就可以当做一个Function对象来使用
function 函数名(arg1, arg2, ..., argN){
//方法体
}
<script>
第二种方式:
<script>
//定义一个变量指向Function对象
var 变量名 = function 函数名(arg1, arg2, ..., argN){
//方法体
}
<script>
第三种方式:
<script>
//定义一个变量接收Function对象
var 变量名 = new function(arg1, arg2, ..., argN, function_body)
<script>
示例:
<script>
//定义一个变量接收Function对象
var f = new Function("a", "b", "alert(a+b);");
f(1,2);//弹出结果 3
<script>
注意: 尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。
2. 属性
使用Function对象的length
属性可以获得方法形参的个数。
<script>
function f(a,b) {
}
alert(f.length);//弹出结果 2
<script>
3. 方法:
4. 特点:
- 因为都是使用var定义形参,所以形参的类型可以省略。
- 方法是一个对象,如果定义名称相同的方法,会覆盖。
<script>
function add(a,b) {
alert(a + b);
}
//即使参数个数不同也会覆盖
function add(a,b,c) {
alert(a + b + 10);
}
add(5,5);//结果20。注意:没有传值给形参c,c被默认赋值为undefined
</script>
由上可知: 方法的调用只与方法的名称有关,和参数列表无关。
- 在方法声明中有一个隐藏的内置对象 arguments(数组),封装所有的实参。
<script>
//计算n个数的和
function sum() {
let res = 0;
/*for (let argument of arguments) {
res += argument;
}*/
for (var i = 0; i < arguments.length; i++) {
res += arguments[i];
}
alert(res);
}
sum(1, 2, 3, 4, 5);
</script>