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
相關文章
相關標籤/搜索