JavaScript的Function 类型

一,Function定义

  Function实际上是对象,与其他引用类型一样具有属性和方法。Function可以通过三种方法进行定义,分别是函数声明语法定义,函数表达式定义和Function构造函数定义。

  1.函数声明语法定义

function functionName(value1...){
    //函数体
}

  2.函数表达式定义

var functionName = function(value1...){
    //函数体
}

  3.Function构造函数定义

  通过Function构造函数创建函数,可向构造函数中传入任意数量的参数,但值得注意的是传入的最后一个参数会作为函数体,而其他参数则作为参数传入函数中。用该方法去定义函数是不推荐使用的,因为该语法会导致解析两次代码,第一次解析常规ECMAScript代码,第二次解析传入构造函数的字符串,影响性能。

var functionName = new Function("value",...,"函数体");

  注:函数是引入值类型,所以函数名仅仅是指向函数的指针,当使用函数名去赋值给另一个变量名时,仅仅复制的是一个指针。即在下列a设置为null时,仅将a存的指针消除而已,不会影响b调用函数。

var a = b = function(value1){
    return value1;
}
a = null;
b(1);

二、函数的重载

  函数本身是没有重载的,因为在JavaScript中,函数可接收任意个参数,故不会因参数数量不同而发生函数重载。但可以通过特殊的写法实现函数重载。

  思路:利用函数内部属性arguments.length去判断,进行传入不同参数的不同处理,从而实现函数的重载。

三、函数声明与函数表达式的区别

  解析器对这两种定义函数方法的解析是不一样的。解析器会将函数声明的函数优先解析,使其在代码执行前可用(函数声明提前)。而函数表达式会在执行到该行代码才会被解析。

四、闭包
  面试题:将数组中的对象,按某个属性进行排序。

  思路:利用数组的sort()接收一个对比函数,该对比函数是另一个函数的返回值。

var arr = [{name:"lyf",age:20},{name:"gulu",age:18}];
function nameSort(name){
    return function(obj1,obj2){
        return obj1[name]-obj2[name];
    }
}
arr.sort(nameSort("age"));

五、函数内部属性

  1.arguments:包含函数所有参数的伪数组。

          其arguments.callee属性指向含有该arguments对象的函数。该属性可用于递归函数的函数调用。

  例:一个阶乘函数的写法。

function factorial(num){
    if(num<=1){
        return 1;
    }else{
        return num*arguments.callee(num-1);
    }
}//好处:低耦合

  2.this:函数执行的环境变量。

  3.caller:调用当前函数的函数引用。

  例:

function a(){
    console.log(a.caller);//指向调用a的b
}
function b(){
    a();
}
b();

六、函数的属性和方法

  1.length:该属性指定义函数时,需要传入参数的个数。使用为:函数名.length;

  2.prototype:原型函数。

  3.apply和call:方法均改变调用函数的环境对象,简而言之就是改变函数的this值。两者除了传入参数的方式不同外,没有什么区别。apply在传参时,可传入数组或伪数组arguments,call是将参数依次列出传入函数的,具体看以下语法。

    apply(环境对象,[value1,...])或apply(环境对象,arguments)。

    call(环境对象,value1,value2...)

  4.bind()

    创建一个函数实例,其this值会被绑定到传给bind()函数的值。

window.age = 20;
var lizi = {age:18};
function sayAge(){
    alert(this.age);
}
var say = sayAge.bind(lizi);
say();//18

 

posted @ 2017-08-20 13:23  whiteMu  阅读(5161)  评论(0编辑  收藏  举报