首页 > 代码库 > 网站前端_JavaScript.0011.JavaScriptFunction
网站前端_JavaScript.0011.JavaScriptFunction
函数类型:
说明: Function类型实际上是对象,每个函数都是Function类型的实例,而且都与其它引用类型一样具有属性和方法,由于函数是对象,因此函数名实际上也是一个指向函数对象的指针
//函数声明 // - 普的函数声明 var max = function(x, y){ return x>y?1:(x==y?0:-1) } console.log(max(1, 2)) - 使用Function构造函数 var func= new Function(‘x‘, ‘y‘, ‘return x + y‘) console.log(func(1, 2))
注意:使用new Function方式声明函数对象,我们并不推荐,因为这种语法会导致解析两次代码(第一次常规解析,第二次解析传入构造函数中的字符串),会影响性能,这里主要是让大家理解函数是对象,函数名是指针
函数对象:
说明: Js中的函数名本身就是变量,所以函数也可以作为值来使用,也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回
var arr = [2, 3, 6, 1, 8, 9] var cmp = function(x, y){ return x>y?1:(x==y?0:-1) } /* 求最大值思路 * 1.用第二个值与第一个值比较,拿到最大值 * 2.将最大值赋值给第二个值,继续下一次循环 * */ function max(cmp, arr){ var maxNum = null for(var i=1; i<arr.length; i++){ maxNum = cmp(arr[i], arr[i-1])==1?arr[i]:arr[i-1] arr[i] = maxNum } return maxNum } // 将cmp作为函数对象传入,arr作为数组对象传入 console.log(max(cmp, arr))
内部属性:
说明: 函数内部有两个特殊对象,arguments(是一个类数组对象,包含传入函数的所有参数,主要用途是保存函数参数,它有一个非常有用的callee属性,该属性是一个指针,指向拥有arguments对象的函数,常用于递归函数)和this(表示函数调用语句所处的那个作用域,当在全局作用域中调用函数时,this对象引用的就是window,支持加点访问作用域内的一切属性和方法)
// 递归 - 常规递归写法,函数内部一定会调用自身,如果函数名变化,则内部函数名也必须改变 function recursion(num){ if(num==1){ return 1 }else{ return num*recursion(num-1) } } // 递归 - 推荐递归写法,函数内部一定会调用自身,如果函数名变化,则内部函数名不需去改变 function recursion(num){ if(num==1){ return 1 }else { return num*arguments.callee(num-1) } } console.log(recursion(100)) // this - 全局作用域就是window,局部作用域就是局部对象 window.color = ‘red‘ // red console.log(this.color) var obj = { color: ‘blue‘, getColor: function(){ // blue return this.color } } console.log(obj.getColor())
函数方法:
说明: Js中函数是对象,对象有属性和方法,那么函数也可有属性和方法,每个函数都包含两个属性length(表示函数希望接收的命名参数的个数)和prototype(保存所有实例方法的真正所在,也就是原型,它也有两个方法applay(scope, [arg1..argn])和call(scope, arg1...argn)),它们真正的作用在于扩展作用域实现不同作用域下的不同效果
function createApp(env){ /* 生成不同环境下的APP * test -> testScope * prod -> prodScope * */ var envInfo = ‘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传递参数必须逐个传递
本文出自 “ζ自动化运维开发之路ζ” 博客,请务必保留此出处http://xmdevops.blog.51cto.com/11144840/1851226
网站前端_JavaScript.0011.JavaScriptFunction