JavaScript.0012-基础入门.JavaScript函数类型,Date属于引用类型,引用类型是一种数据结构,用于将数据和功能组织在一起,如var newDate = new Date(),这行代码创建了Date引用类型的一个新实例,保存在newDate中,使用的构造函数是Date,它只为新对象定义了默认的属性和方法。
函数类型:
说明: Function类型实际上是对象,每个函数都是Function类型的实例,而且都与其它引用类型一样具有属性和方法,由于函数是对象,因此函数名实际上也是一个指向函数对象的指针
1 2 3 4 5 6 7 8 9 10 11/* *函数声明 */ //普的函数声明 varmax=function(x,y){ returnx>y?1:(x==y?0:-1) } console.log(max(1,2)) //使用Function构造函数 varfunc=newFunction('x','y','returnx+y') console.log(func(1,2))
注意:使用new Function方式声明函数对象,我们并不推荐,因为这种语法会导致解析两次代码(第一次常规解析,第二次解析传入构造函数中的字符串),会影响性能,这里主要是让大家理解函数是对象,函数名是指针
函数对象:
说明: Js中的函数名本身就是变量,所以函数也可以作为值来使用,也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19vararr=[2,3,6,1,8,9] varcmp=function(x,y){ returnx>y?1:(x==y?0:-1) } /*求最大值思路 *1.用第二个值与第一个值比较,拿到最大值 *2.将最大值赋值给第二个值,继续下一次循环 **/ functionmax(cmp,arr){ varmaxNum=null for(vari=1;i
内部属性:
说明: 函数内部有两个特殊对象,arguments(是一个类数组对象,包含传入函数的所有参数,主要用途是保存函数参数,它有一个非常有用的callee属性,该属性是一个指针,指向拥有arguments对象的函数,常用于递归函数)和this(表示函数调用语句所处的那个作用域,当在全局作用域中调用函数时,this对象引用的就是window,支持加点访问作用域内的一切属性和方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29//递归-常规递归写法,函数内部一定会调用自身,如果函数名变化,则内部函数名也必须改变 functionrecursion(num){ if(num==1){ return1 }else{ returnnum*recursion(num-1) } } //递归-推荐递归写法,函数内部一定会调用自身,如果函数名变化,则内部函数名不需去改变 functionrecursion(num){ if(num==1){ return1 }else{ returnnum*arguments.callee(num-1) } } console.log(recursion(100)) //this-全局作用域就是window,局部作用域就是局部对象 window.color='red' //red console.log(this.color) varobj={ color:'blue', getColor:function(){ //blue returnthis.color } } console.log(obj.getColor())
函数方法:
说明: Js中函数是对象,对象有属性和方法,那么函数也可有属性和方法,每个函数都包含两个属性length(表示函数希望接收的命名参数的个数)和prototype(保存所有实例方法的真正所在,也就是原型,它也有两个方法applay(scope, [arg1..argn])和call(scope, arg1...argn)),它们真正的作用在于扩展作用域实现不同作用域下的不同效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23functioncreateApp(env){ /*生成不同环境下的APP *test->testScope *prod->prodScope **/ varenvInfo='env:'+env+'\n' +'host:'+this.host+'\n' +'port:'+this.port alert(envInfo) } testScope={ host:'123.59.27.192', port:'8083' } prodScope={ host:'120.132.75.75', port:'8083' } //基于测试环境对象调用createApp函数 createApp.apply(testScope,['test']) //基于正式环境对象调用createApp函数 createApp.call(prodScope,'prod')
技巧: 使用call()和applay()来扩充作用域的最大好处就是对象不需要与方法发生任何耦合关系,更加便于扩展和维护,它们两个的区别在于传递参数的方式不同applay第二个参数是一个类数组对象即可(如果在函数内部可直接传递arguments),而call传递参数必须逐个传递。
就爱阅读www.92to.com网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/03-15/18806765.html