1.函数定义
JS中用 function 关键字来声明函数。函数的定义和Java类似分为两种方式:命名函数、匿名函数。命名函数即是有函数名,匿名函数即没有函数名,匿名函数要被调用的话必须被一个变量接收,或者自调用。
function f1() {
alert("命名函数")
}
// 命名函数调用通过函数名()
f1();
// 匿名函数需要赋值给变量,组成函数表达式才能使用,后面需要加分号
// 此时f2就是一个函数
var f2 = function () {
alert("匿名函数")
};
// 匿名函数调用通过变量()
f1();
2.函数覆盖
JS中是不支持函数的重载的,同名函数后面的函数会覆盖前面的函数,因为函数中维护着arguments 对象,它是函数内部的一个类数组对象,它里面保存着调用函数时,传递给函数的所有参数。对应传入的实参个数没有限制。但是可以通过模拟来实现函数重载。
// 命名函数
function f1() {
console.log("第一个f1");
}
function f1() {
console.log("第二个f1");
}
f1(); // 第二个f1
// 匿名函数
var f2 = function () {
console.log("第一个f2");
};
f2(); //第一个f2
f2 = function () {
console.log("第二个f2");
};
f2(); //第二个f2
由于匿名函数没有函数名,所以就不存在同名覆盖的问题,以上代码相当于变量f2重新被赋值为一个新的匿名函数。
函数重载模拟
- 通过arguments对象
- …待续
function f1() {
if (arguments.length == 1){
} else if (arguments.length == 2 ){
}
...
}
通过传入实参个数控制执行逻辑,比较鸡肋,这种重载模拟和Java中的方法重载概念还是有很大差别的,Java中是有多个同名方法,但参数类型或者参数个数不同。
3.函数的自调用
匿名函数除了可以赋值给变量外,还可以自己调用自己,自调用函数只能被执行一次。
//函数被调用
(function f() {
alert("匿名函数f")
})();
4.函数也是一种数据类型
通过typeof查看函数类型,发现函数是function 类型。
function f() {
// ...
}
console.log(typeof f);//function
5.函数作为参数使用
由于函数的形参是不限制参数类型及个数的,既然函数也是一种数据类型,那么也可以作为参数使用。如果一个函数作为参数,那么我们说这个参数(函数)可以叫回调函数
//此时函数形参是一个函数
function f(f1) {
//函数f1被调用
f1();
console.log("f调用");
}
function f1() {
console.log("f1调用")
}
f(f1);
//f1调用
//f调用
// 上面的写法其实和这种方式等同
var f1 = function f1() {
console.log("f1调用")
};
f(f1);
//f1调用
//f调用
由于f()被调用时,传入的参数f1是一个函数,所有f()函数内部可以通过函数名f1调用f1函数。
6.函数作为返回值使用
函数的返回值可以是一个函数。
function f() {
return function () {
console.log("作为返回值得函数调用");
}
}
var temp = f();
temp();//作为返回值得函数调用
简单整理,如有问题恳请指正。