一、函数声明 声明的方式有函数的提升
//有变量提升
function fun(a,b){
console.log(a*b);
}
fun(5,6); //30
二、函数表达式(匿名函数)
fun(5,6);
var fun = function(a,b){
console.log(a + b);
}
//注:这样写会报下面这个错:
正确的写法:
var fun = function(a,b){
console.log(a + b);
}
fun(5,6); //11
三、对象的方式
//new 开辟的空间 Function是类型
//let 函数名 = new Function("参数列表,多个参数 用逗号隔开","代码段");
let fun = new Function("a","b","console.log(a+b)");
fun(5,6); //11
四、函数是功能完整的类
- 既然定义一个函数就是创建一个函数对象。
- 那么只要执行函数定义的代码,就会创建新的函数对象
下面会议闭包,以闭包为例:
function f1(){
var n = 250;
function f2(){
n++;
console.log(n);
}
return f2;
}
// 从这 以上,相对于 new 一个对象
var f21 = f1();//f21就是f2
f21();//调用f2;
f21();//调用f2;
var f22= f1();//f22就是f2
f22();//调用f2;
f22();//调用f2;
虽然f21和f22的代码一样,但是,它们是两个不同的对象,即,每个的n值不一样。
所以函数等价于类?
函数名作为参数和返回值:
函数名能作为返回值,那么匿名函数也就可以作为返回值。
当我们知道函数是对象,函数名是对象名(变量名)时,函数名作为另外一个函数的参数和返回值就不难理解了。还记得当时讲数组的sort函数是,参数就是另外一个函数名。
五、函数的内置对象
自动产生,不需要用函数名来调用
arguments 是是JavaScript里的一个内置对象。
- arguments(他就是 一个数组)对象保存函数的所有参数, 虽然可以像数组一样的访问每个参数,但是,并不是标准的数组(没法使用push等函数);arguments对象不但保存着所有的参数,而且还有一个名叫callee的属性。Callee属性是个指针,指向了arguments对象所在的函数。
function fun(){
for(let i = 0; i < arguments.length;i++){
console.log(arguments[i]);
}
}
fun(1,3,5);//1 3 5
注:
1、arguments 是一个伪数组,它可以获取函数调用时 实参的数值;
2、rguments对象不但保存着所有的参数,而且还有一个名叫callee的属性。Callee属性是个指针,指向了arguments对象所在的函数,等价于 函数本身,在工作中,可以用在 递归处。
function fun(){
// for(let i = 0; i < arguments.length;i++){
// console.log(arguments[i]);
// }
console.log(arguments.callee);
}
fun(1,3,5);
递归案例:
//10 的阶乘
function fun(n){
let c;
if(n == 1){ //如果 n 等等于1的话,c就等于1
c = 1;
}else{
c = n * fun(n - 1); //这块他就等价于 arguments.callee(n - 1);
}
return c;
}
console.log(fun(10)); //3628800