一、函数本质
- 函数本质上就是对象,函数名指向函数对象。
function f(){
return 123;
}
var num = f();
var x = f;
console.log(typeof f); //function
二、创建函数(共3种方法)
- 直接使用function关键字声明新的函数
function f1(){}
- 使用Function对象创建
var f2 = new Function()
- 匿名函数
var f3 = function(){}
三、arguments对象
- arguments属性是一个类数组对象,每个Function对象都具有该属性
- arguments属性只在函数执行体内有效,从中可以读取当前函数接收到的所有实参
- 使用arguments对象可以处理可变数量的参数,从而解决JavaScript所不支持的多态性
- 属性:length:返回所传入实参的个数
function add(num1,num2){
return num1 + num2;
}
function add(num1,num2,num3){
return num1 + num2 + num3;
}
console.log(add(10)); //NaN
console.log(add(10,20)); //NaN
console.log(add(10,20,30)); //60
由上面例子可以看出,JavaScript中不支持多态,下面用arguments来解决这个问题
function add(){
var sum = 0;
for(var i = 0 ;i<arguments.length;i++){
sum += arguments[i];
}
return sum;
}
console.log(add(10)); //10
console.log(add(10,20)); //30
console.log(add(10,20,30)); //60
四、函数的种类
1、 标准自定义函数
- 声明提升(函数、变量)
2、 表达式函数
- 传递性
var add = function(){
console.log("ok");
}
var t = add ; //这里传递的是内存地址
- 本质:add是指向内存的指针,调用时是在指向的内存中把程序拿出来执行一次。
3、 嵌套函数
function a(){
function b(){
}
}
- b()在外面不能被访问
- 要想在外面访问b,要在程序中用return
function a(){
function b(){
}
return b;
}
4、 匿名函数
function() {}
- 只能立即调用
- 匿名函数不需要起名字,少占用变量;效率更高;主要用在你封闭作用域上
5、 回调函数
- 把一个函数名作为实际参数传递给另外一个函数
function a(){
console.log("hello");
}
function print(fn){
fn();
}
print(a); //hello
6、 递归函数
- 自己调用自己
- 必须有个结束条件
- 思想:要解决一个问题,必须先解决前一个问题,直至能解决的问题
var i = 1 ;
function a(){
console.log(i++);
if(i < 10){
a();
}
}
a();
7、 系统函数
- setInterval()
- setTimeOut()
8、 懒函数
- 只做一次就变化的函数
- 用途:优化JS性能、创建对象、处理兼容性……
function a(){
console.log("hello")
a = 5;
}
a(); //hello
a(); //会报错