JavaScript的Function 类型

一,Function定义面试

  Function其实是对象,与其余引用类型同样具备属性和方法。Function能够经过三种方法进行定义,分别是函数声明语法定义,函数表达式定义和Function构造函数定义。数组

  1.函数声明语法定义闭包

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

  2.函数表达式定义app

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

  3.Function构造函数定义函数

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

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

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

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

2、函数的重载spa

  函数自己是没有重载的,由于在JavaScript中,函数可接收任意个参数,故不会因参数数量不一样而发生函数重载。但能够经过特殊的写法实现函数重载。prototype

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

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

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

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

  思路:利用数组的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"));

5、函数内部属性

  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();

6、函数的属性和方法

  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
相关文章
相关标签/搜索