function类型
在ECMAScript中,Function(函数)类型实际上是引用类型,每个函数都是Function类型的对象,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的引用类型变量
1、函数的声明方式:
①普通的方式:function fun(num1,num2){
return num1+num2;
}
②使用变量方式声明: var fun2 = function(a,b){
return a+b;
}
③使用new创建函数:var fun3 = new Function('n1','n2','return n1+n2');//不建议使用,js引擎需要解析2次 首先解析语法,之后解析参数,功能。运行起来性能较低,这种写法更能直观的看出函数是引用类型
函数作为参数如何传递:
ECMAScript中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。
function add(a,b){
return a+b;
}
function show(fun,num){
retrun fun(num,88);
}
show(add,66);
函数内部属性:
1、arguments属性:指向一个类似数组但不是数组的对象,
存储的是实际传递给函数的参数(hi就存在了函数内部的arguments当中)
,而不局限于于函数声明所定义的参数列表
function show(a,b)
{
//alert(arguments.length);//内部存储数据的个数(传参个数 //从1开始)
if(arguments.length == 2)
alert(a+b);
else if(arguments.length == 3)
alert(arguments[0] + arguments[1] + arguments[2]);//虽然表示的方式与数组一样,但是arguments不是数组
}
show("hi","world","hello");
2、length属性:
函数定义时
所指定参数的个数
函数名.length 如上例子:alert(show.length);//显示2 (显示的是show(a,b)a,b 两个参数,所以长度为2)
3、arguments中的callee属性:它表示对函数对象本身的引用
arguments指定的是一个对象,对象中还可以有属性
//使用递归求阶乘
function jie(){
if(n=1)
return 1;
else
return n+arguments.callee(n-1);//callee实际上是个引用,引用指向对象,他默认指向这个函数本身,她所在的函数对象,就相当于写函数名(n+jie(n-1);这样写的话当函数名发生变化时这里自身调用的函数名也要改变)
}
好处:如果函数名发生变化,调用自身语句不用改,更加方便不易出错
4、局部变量和全局变量
var b =88;//在函数外定义的变量,为全局变量,他是公共的,任何一个函数都可以使用。
function fun(){
var a = 66;//局部变量,只能被其所在的函数使用
var b = 99;//局部变量和全局变量同名时,全局变量无效
}
fun();
5、this : 是一个引用类型的变量,指向函数被调用时的对象(这个函数是哪个函数调用的,this就指向哪个对象,它内部自动变化)
var name = "zhangsan";
function show(){
alert(name);
}
show();//window对象调用的(window对象是js中最顶层的对象 已经创建好存在的对象最大的对象相当于window.show() window可省略 this指向的就是window对象)
var obj = {
name:"lisi",
show:function(){
alert(this.name);//相当于obj.name
}
}
obj.show();//this指向的是obj对象,this是动态变化的
var color="red";
function fun(){
alert(this.color);
}
var objs ={
color:"blue";
};
fun();//默认为window.fun() 注意时刻不同this的指向不同 这个时候this指向的是window对象,指向
fun(){
alert(window.color);//显示的是红色
}
objs.showColor = fun;//给对象objs添加一个showColor方法并赋值为fun函数
objs.showColor();//这个时候调用objs中的 this此时指向的是objs这个对象
fun(){
alert(obj.color);}(显示蓝色)
6、函数内部方法call() apply()【Function内部有一个prototype属性,该属性含有两个方法call() apply()】
function sum(num1,num2){
return num1+num2;
}
function show1(num1,num2){
return sum.call(this,num1,num2);//函数名.call(第一个参数是调用sum函数的对象,后边的参数是传递给sum函数实际数据)
}
function show2(num1,num2){
return sum.apply(this,[num1,num2]);//
第一个参数是调用sum函数的对象,this所指向的对象去调用,,后边的参数是传递给sum函数实际数据)
}
//
call() apply()区别:传参方式不同
//sum.call(this,num1,num2);
//sum.apply(this,[num1,num2]);
alert(show1(10,10));//window调用的show1,this指向的是window对象
alert(show2(10,10));//window调用的show2,this指向的是window对象
//
可以使用call() apply()方法改变调用函数的对象
function test(){
this.property ="hello world";
}
test();//this指向了window
alert(window.property);//显示的是hello world
var obj1={};
test.call(obj1);//this指向的是obj1
alert(obj1.property);//显示的是hello world