JavaScript.基础入门-0012.JavaScript函数类型

日期简介:

说明: Date属于引用类型,引用类型是一种数据结构,用于将数据和功能组织在一起,如var newDate = new Date(),这行代码创建了Date引用类型的一个新实例,保存在newDate中,使用的构造函数是Date,它只为新对象定义了默认的属性和方法.
 

函数类型:

说明: Function类型实际上是对象,每个函数都是Function类型的实例,而且都与其它引用类型一样具有属性和方法,由于函数是对象,因此函数名实际上也是一个指向函数对象的指针

1

2

3

4

5

6

7

8

9

10

11

/*

 * 函数声明

 */

// 普的函数声明

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中的函数名本身就是变量,所以函数也可以作为值来使用,也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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,支持加点访问作用域内的一切属性和方法)

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

// 递归 - 常规递归写法,函数内部一定会调用自身,如果函数名变化,则内部函数名也必须改变

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)),它们真正的作用在于扩展作用域实现不同作用域下的不同效果

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

JavaScript.基础入门-0012.JavaScript函数类型

转载于:https://my.oschina.net/learnbo/blog/858158