JavaScript函数隐形参数
⼀、函数概念
1、函数也是⼀个对象
2、函数可以封装⼀些功能(代码),在需要的时候可以执⾏这些功能(代码)
3、使⽤typeof 检查⼀个函数对象时,会返回function
⼆、函数的创建
1、函数对象(理解函数是对象即可,开发中,不会⽤构造函数创建函数对象)
var fun = new Function("str"); //str 就是⼀堆功能代码 可以理解成str是function对象构造函数的形参
将封装的代码以字符串的形式传递给构造函数。
exp: var fun = new Function("console.log('Hello 第⼀个函数');")
函数中的代码不会⽴即执⾏,函数中的代码在函数调⽤的时候执⾏。
函数调⽤语法: 函数对象();
exp: fun(); //调⽤函数fun,执⾏⾥⾯的代码。
调⽤函数时,函数中封装的代码会按照顺序执⾏。
函数对象具有普通对象的功能(⽐如可以添加属性 fun.name="JJ"),但是函数对象更强⼤,可以封装代码。
2、创建⼀个函数
2.1使⽤函数声明创建函数
使⽤function关键字来创建函数
function 函数名(【形参1,形参2,...形参N】){ //可以⽆参
函数体;
【return 返回值;】 // JS中,如果函数有返回值,直接在函数体内return即可,不需要在定义的时候指明返回类型。
}
注意:js中,由于所有变量都是var,所有形参⾥⾯就直接给形参个数就⾏了,不⽤带var。
exp:
function fun(a,b){
alert("有参函数被调⽤啦 a="+ a +",b="+b);
}
2.2使⽤函数表达式来创建函数
var 函数名 = function(【形参1,形参2,...形参N】){ //右边是⼀个匿名函数,由于没名字不会调⽤,所以需要将其赋值给⼀个变量
函数体;
}; //注意,这是⼀个赋值语句,所以有分号
注意:如果本来函数就只打算执⾏⼀次,也就没必要赋值给变量,定义完成⽴即执⾏就⾏了。就可以将匿名函数处理成⽴即执⾏函数。⽴即执⾏函数
⽴即执⾏函数语法:(匿名函数)(实参1,实参2...); //⽴即执⾏函数,⽤于只执⾏⼀次的场合(由于没有变量保存,执⾏完了也不到了)
(function(【形参1,形参2,...形参N】){
函数体;
})(实参1,实参2....); //括号表⽰函数调⽤
3.函数的形参与实参
形参是在函数调⽤时才定义的参数,可以在函数的()中指定⼀个或多个形参。多个形参之间⽤,隔开。声明形参就相当于在函数内部声明了对应的变量,但是并不赋值。
实参
在调⽤函数时,可以在()中指定实参(实际参数)。实参会赋值给函数中对应的形参。实参可以是任意值,包括对象和函数(函数本⾝也是对象)
注意:
1、解析器不会检查实参的数据类型。所以要注意是否可能会接收到⾮法参数
2、解析器不会检查实参数量,所以实参⽐形参个数多(多的实参⾃动赋值给隐形形参了)。也可以⽐形参个数少,这样多的形参就会被赋值undefined
形参作为函数
exp:function mianji(r){ //定义圆的⾯积公式
return 3.14*r*r;
}
function fun(a,r){ //在创建⼀个函数计算半径为r的圆的⾯积,a传⼊⾯积公式函数
a(r);
}
fun(mianji,4); //计算半径为4的圆的⾯积
4.函数返回值 return
return 获取函数返回值。
语法:
return 值/变量 ; //return后的值将会作为函数的执⾏结果返回,可以定义⼀个变量来接收该结果。
exp:function sum(a,b,c){
var d = a+b+c;
return d; //d作为函数结果返回
var result = sum(1,2,3); // result接收函数的返回结果(d),函数返回什么,result就是什么
注意:return可以返回任意类型的值 (Number,String,),包括表达式的值 return a+b;尤其注意,也可以是对象(包括函数对象)//理解闭包的时候,就需要返回函数
函数中,return后的语句,都不会执⾏(和break⼀样)
如果return 后⾯不跟任何值 ,相当于返回undefined;函数中不写return同样返回undefined
exp:
function fun1(){
function fun2(){
alert("我是2号函数");
}
return fun2; //把fun2作为函数结果返回,此时fun1() 就是 fun2函数。
}
a=fun1() //调⽤fun1函数,并将返回结果赋值给a,此时a=fun2
javascript说明a(); // 调⽤函数fun2,相当于fun2()。 如果没有引⼊a这个变量接收返回结果,这⼀步调⽤相当于fun1()()。
JS中,由于java的变量定义时都是var,所以直接在函数体内return即可,不需要在定义的时候指明返回类型。
注意: JS不允许函数重载,重新定义同名函数以后,新函数会直接覆盖掉旧函数。
exp:
function fun(a,b){ //定义有参函数fun
alert("有参函数被调⽤啦 a="+ a +",b="+b);
}
function fun(){ //定义⽆参函数fun
alert("舒服死我了");
}
fun(3,4); //执⾏函数fun,由于JS不允许函数重载,有参函数定义被覆盖,执⾏结果为"舒服死我了”
fun(); //执⾏函数fun,输出“舒服死我了”
三、 函数对象 的⽅法 apply 和 call
前⾯说了,函数也是⼀个对象。所以,函数也有⾃⼰的⽅法 apply 和 call,需要通过函数对象来调⽤。
主要⽤于指定上下⽂对象 this指针的指向。两种⽅法区别在于形参传递⽅式不同。
1、call()⽅法 ⼀个⼀个传递参数
语法:函数名.call(object,参数1,参数2....)
说明:形参是⼀个对象,这个对象将⾃动成为函数的第⼀个形参,即成为函数执⾏时的this。参数1,参数2传⼊函数定义⾥⾯的形参,函数没定义形参,就没有。
2、apply()⽅法 封装成数组⼀次传
语法:函数名.apply(object,数组)
说明:形参是⼀个对象,这个对象将⾃动成为函数的第⼀个形参,即成为函数执⾏时的this。不同的是,apply()需要将实参封装到⼀个数组中,统⼀传递。
function fun(a,b){ //定义⼀个fun函数
console.log("a="+a+"b="+b);
alert(this.name);}
var obj={name:TT};
var obj2={name:ZZ};
fun(15,20); //直接调⽤fun函数,此时this是window
fun.apply(obj,[15,20]);
/*说明:通过函数对象⽅法apply 调⽤fun函数,此时obj对象变成fun函数的第⼀个形参,this变成obj。数组⾥⾯的15,20分别传递给fun 函数形参a和形参b*/
fun.call(obj2,15,20);
/*说明:通过函数对象⽅法call 调⽤fun函数,此时obj对象变成fun函数的第⼀个形参,this变成obj。15和20分别传给fun函数形参a和fun函数形参b */
四、JS函数中的隐形对象
函数调⽤时,浏览器每次会传递进两个隐形对象。
1、this对象: 函数上下⽂对象。
2、arguments对象:封装实参的对象
在function函数中不需要定义,但却可以直接⽤来获取所有参数的变量。是⼀个类数组对象(不是数组,但也可以通过索引操作数据,获取长度)。在调⽤函数时,我们传递的所有实参都会在arguments对象中保存。
实参1传给arguments[0],实参2传给arguments[1],依次类推。
3、arguments对象 的属性 callee
arguments对象有⼀个属性callee,这个属性的值指向当前的函数对象。
function fun(){ //定义fun函数。
alert("arguments[0]"); //显式查看 调⽤函数后传⼊的第⼀个实参 即 2
alert("arguments[1]"); //显式查看 调⽤函数后传⼊的第⼆个实参 即 love
alert("arguments[2]"); //显式查看 调⽤函数后传⼊的第三个实参 即 false
alert("舒服死我了"); //⾃动创建实参arguments[3],并赋值"舒服死我了"
alert(arguments.length); //查看实参个数,即4
console.log(arguments.callee); // 即打印当前函数对象 function fun(){}
}
fun(2,"love","false") //调⽤fun函数,并传⼊实参 2,"love","false"
☆JS会根据函数的实际使⽤情况,来补充函数定义中的隐藏参数。
exp:编写⼀个函数,⽤于计算所有参数相加的和
function sum(num1,num2){ //写两个形参纯粹为了好看,由于会补充隐藏参数,可以不写形参
var result=0;
for(var i=0;i<arguments.length;i++) //遍历函数所有参数,包括隐藏的参数
{ result=result+arguments[i];} //所有参数求和
return result;
}
alert(sum(1,2,3,4,5,6,7,8,9)); //函数体定义只写了num1和num2两个形参,3,4,5..9,就是隐形参数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论