1 回调函数:一个函数的 函数名 作为另外一个函数的 实参 传入
2 函数的闭包:一个函数是另外一个函数的返回值
3 函数名代表函数整体,函数名+()代表函数的执行
形参可以传入的值,形参可以传入任何类型的值,包括简单数据类型和复杂数据类型,其中复杂数据类型包括了函数
function fn (num1,num2,rule){
return rule(num1,num2);
}
function rule1(num1,num2){
return num1 + num2 ;
}
function rule2(num1,num2){
return num1 - num2 ;
}
function rule3(num1,num2){
return num1 * num2 ;
}
function rule4(num1,num2){
return num1 / num2 ;
}
console.log(fn(3,6,rule1));
console.log(fn(3,6,rule2));
console.log(fn(3,6,rule3));
console.log(fn(3,6,rule4));
控制台输出:
9
-3
18
0.5
因为在定义函数fn的时候,rule(num1,num2),中 rule 被定义为只能传入函数,所以只能在 形参rule的位置传入实参是个函数,而rule函数定义了num1 和 num2 是什么类型的值
console.log(fn(null,6,rule1)); 6
console.log(fn(undefined,6,rule1)); NaN
console.log(fn(rule1(8,4),rule2(4,2),rule3)) 24
console.log(fn(rule1(8,4),rule2(4,2),rule3 ,rule4)) 24
多传进来的值会被忽略
需要注意的是函数名可以被传入,因为在创建函数的时候,函数名指向了堆内存中的地址,传入该地址,则代表引用该函数。
一旦加了 ( ).就代表调用并且执行了该函数
console.log(fn(3,6,rule1()));
这行代码会报错,因为 rule1() 被直接执行了,此时传入的是 rule1 () 执行后的返回值,
函数名代表函数整体,函数名+()代表函数的执行小案例解析
(1) 返回函数名
console.log(fn());
function fn(){
return fn1;
}
function fn1(){
console.log("这是函数闭包的运用");
}
控制台输出:
function fn1(){
console.log(“这是函数闭包的运用”);
}
(2) 返回 函数名+()
console.log(fn());
function fn(){
return fn1;
}
function fn1(){
console.log("这是函数闭包的运用");
}
控制台输出:
这是函数闭包的运用
4 注意:
A 函数不调用则不执行,函数名代表函数整体,可以进行输出,打印,等操作,也可以作为其他函数的参数传入
B 函数名+()则代表该函数被执行了,无论其被打印、输出,或者被其他函数调用,或者作为其他函数的返回值,结果都是其执行之后所返回的内容
C 函数名+() 执行之后返回值得内容有以下几种情况:
a 当函数体内没有写 return 的时候,没有返回值,如果输出console.log(fn());(fn()代表一个定义过的函数)结果为undefined ;
b 当函数体内写了 return 之后,后面没有跟内容,默认返回值是 undefined
c 函数体内写了 return ,后面也跟了内容,那么返回后面跟的内容;
d 函数语句执行到 return 之后,后面的语句不会执行。