函数概述
函数是ECMAScript的核心。
声明方式:关键字function,函数名,一组参数,以及在括号中待执行的代码。
如果函数无明确的返回值,或者调用了没有参数的return语句,返回的值是undefined
arguments对象
在函数代码中,使用特殊对象arguments的作用:
- 就无需明确指出参数名,就能访问它们
- 可用来检测函数对象的参数个数
- 模拟函数重载
function explainArguments() {
// 访问,检测个数
console.log(arguments[0], arguments.length);
// 模拟函数重载
if (arguments.length === 1) {
console.log(arguments[0] + '拼接');
} else if (arguments.length === 2) {
console.log(arguments[1] + 100);
}
}
explainArguments('string', 100, '456'); // string, 3
explainArguments('string', 100); // 200
explainArguments('string'); // string拼接
Function对象(类)
ECMAScript的函数实际上是功能完整的对象。
Function类可以表示开发者定义的任何函数。
用Function类直接创建函数的语法如下:
var function_name = new function(arg1, arg2, ..., argN, function_body)
理解:
function add(iNum) {
console.log(iNum + 10);
}
function add(iNum) {
console.log(iNum + 20);
}
add(10); // 30 第二个函数重载了第一个函数
重写代码来理解:
var add = new Function('iNum', 'console.log(iNum + 10)');
var add = new Function('iNum', 'console.log(iNum + 20)'); // 重新定义了
add(10); // 30
例如:
如下代码,add被定义为函数,newAdd被声明为指向同一个函数的指针。用这两个变量都可以执行该函数的代码,输出相同的结果。因此,如果函数名只是指向函数的变量,可以把函数作为参数传递给另一个函数。
var add = new Function('iNum', 'console.log(iNum + 10)');
var newAdd = add;
add(10); // 20
newAdd(10); // 20
如下代码,传参两个,要调用的函数和快递给该函数的参数
function foo(fn, arg) {
fn(arg);
}
var add = new Function('iNum', 'console.log(iNum + 10)');
foo(add, 10); // 20
尽量不使用Function构造函数来创建函数,因为它定义函数比用传统方式要慢得多。所有函数都应该看作Function类的实例
Function对象的length属性
如下函数,add()定义一个参数,长度为1;add2()没有定义参数,长度为0。
function add(iNum) {
console.log(iNum);
}
function add2() {
console.log('123');
}
console.log(add.length); // 1
console.log(add2.length); // 0
ECMAScript可以接受任意多个参数(最多25个)
Function对象的方法
Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。
function add(iNum) {
console.log(iNum + 10);
}
add.toString();