首页 > 代码库 > 网站前端_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