原来你是这样的函数
首先我们需要知道函数的定义方式,函数是在什么时候定义的,函数的参数的传递问题,重点理解将函数视为值:可赋值给变量,可以作为函数参数,也可以作为函数的返回值…
1. 函数的定义方式有两种
1.1函数的声明
function numAdd(num1,num2){
console.log(num1+'+'+num2+'='+(num1+num2));
}
numAdd(4,5);
1.2函数表达式
var add=function(num1,num2){
console.log(num1+'+'+num2+'='+(num1+num2));
}
add(5,9);
2.函数是什么时候定义的
浏览器分两遍来执行js代码,第一遍浏览器会分析所有的函数声明,并定义函数声明创建的函数,(当然此时浏览器不会执行函数中的代码,需要在被调用的时候执行);第二遍浏览器会按顺序自上而下的执行js代码并且定义函数表达式创建的函数;
使用函数声明创建的函数是在使用函数表达式创建的函数之前就定义好的。函数的声明可以放在任何地方且可在任何地方调用他们----函数声明的提升
3.函数参数的问题
3.1调用函数时需要注意的点
函数中可以定义(0-N)个形参,调用函数时要使用实参进行调用
(1) 当传入实参的个数<形参的个数时,结果为undefined
function numAdd(num1,num2){
console.log(num1+'+'+num2+'='+(num1+num2));
}
numAdd(3);
结果:3+undefined=NaN
(2) 当传入实参的个数>形参的个数时 ,结果为Js将忽略调多余的实参
numAdd(2,4,6,8);
结果2+4=6
3.2传入实参的类型
(1) 基本类型作为函数的参数
实参是按值传递的,传递的是实参的副本,函数内部的修改,不会影响到函数外部变量的值
function num(num1){
num1=2;
console.log(num1);
}
var test=1;
num(test);
console.log(test);
结果: 2
1
(2) 引用类型作为函数的参数
将实参对象传递给函数时,传递的是对象的引用,在函数内部修改对象的属性 修改的将是原始对象的属性(也可以说实参形参指向的是同一个对象)
var dog1={name:'xixi',age:12};
var dog2=dog1;
dog2.name='hihi';
console.log(dog1.name);
结果:hihi
4.将函数视为值
将函数视为值,其实这个值实际上是指向函数的引用;无论是在使用函数声明还是函数表达式定义函数,得到的都是这个函数的引用;
函数和其他类型的值相比,函数值的不同之处在于我们可以调用函数来执行函数体中的代码
4.1 将函数赋值给变量
var fly=function(num){
for(var i=0;i<num;i++){
console.log("Flying!");
};
};
var superfly=fly;
superfly(2);
结果: Flying!
Flying!
4.2 将函数作为实参
向函数传递函数时,传递的是指向函数的引用,可将这种引用传递视为指针,它指向的是函数本身内部的表示
function fun(echo){
console.log(echo);
};
fun('hello');
function boo(afun){
afun('boo');
}
boo(fun);//将函数fun作为函数boo的实参
console.log(fun);//将fun作为值输出(没有被调用)
fun(boo);
结果:
hello
boo
fun(echo){
console.log(echo);
}
boo(afun){
afun('boo');
}
4.3将函数作为返回值
function addN(n){
var adder=function(x){
return n+x;
};
return adder;
};
var add2=addN(2);
console.log(add2(10));
console.log(add2(100));
consloe.log(addN(2));
结果:
12
102
ƒ adder(x){
return n+x;
}