抽象环境,不是解决某个实际问题,根据需求解决对应的问题
例如下面例子,可以给函数传入不同的数值和运算符来进行想要的运算
function fn(a,b,type){
if((a=isNaNNumber(a))===false) return;
if((b=isNaNNumber(b))===false) return;
switch(type){
case "+":
console.log(a+b);
break;
case "-":
console.log(a-b);
break;
case "*":
console.log(a*b);
break;
case "/":
if(b==0){
console.error("除数不能为0");
return;
}
console.log(a/b);
break;
case "%":
console.log(a/b);
break;
default:
console.log(type+"类型错误");
}
}
function isNaNNumber(n){
var s=n;
n=parseInt(n);
if(isNaN(n)){
console.error(s+"不是数值");
return false;
}
return n;
}
fn("10",5,"+");
1.参数是变量,只作用于函数内部,外部不可以调用
function fn(a,b){
a++;
b++;
console.log(a+b);
}
console.log(fn.length);//描述参数的数量
参数是按照顺序赋值的 3对应的是函数中参数a,5对应的是函数中参数b
这里填入了实际真实的值 实参
fn(3,5); // console.log(a+b);打印为10
var a1=3;
var b1=5;
这里填入的是变量,不是实际的值, 形参
fn(a1,b1); //a1对应的是函数中参数a,5对应的是函数中参数b
console.log(a+b);打印为10
console.log(a1);//打印为3
(因为是把a1对应的数值传入了函数里面,而a1未改变)
2.传入参数是对象时
当函数参数是对象时,对对象里面的的属性值进行操作,这样原对象也会发生改变,因为对象是放在堆中的,地址是放在栈中的,他们公用一个地址所以一个如果对象里面的的属性值进行操时,就会改变原对象了,这有就是 console.log(obj1.a,obj1.b);打印的值为什么是2 3了
function fn(obj){
obj.a++;
obj.b++;
console.log(obj.a+obj.b);//5
}
var obj1={
a:1,
b:2
}
fn(obj1);
console.log(obj1.a,obj1.b);// 2 3
function fn(obj){
这句之前obj和外面的obj引用地址相同
obj={a:2,b:3};
重新将obj的引用地址改变,这时候就与外面的obj没有任何关系了
console.log(obj.a++obj.b);
}
var obj={
a:1,
b:2
}
fn(obj);
console.log(obj);
打印结果如图所示
3.传入参数是函数时
回调函数,将函数作为参数传入到另一个函数中,在需要执行时触发执行该函数
回调函数的目的就是为了让在两个不同的地方,互相不能确定时,进行调用
function fn(f){
f();
}
function fn1(){
console.log("aaaa");
}
fn(fn1);
4.传入参数是任意多个参数时
function fn(){
console.log(arguments);//参数集
for(var i=0,sum=0;i<arguments.length;i++){
sum+=arguments[i];
}
console.log(sum);
}
fn(3,4,5,6,7);
console.log(fn.length);//0
打印结果如图所示:
function fn(){
//arguments.callee就是当前函数
console.log(arguments.callee===fn);
//arguments.callee.name就是当前正在执行的该函数名
console.log(arguments.callee.caller.arguments);
//arguments.callee.caller 执行该函数的环境函数,
//当前函数在那个函数里执行的
}
function fn1(){
fn(1,2,3,4);
}
fn1(5,6,7)