1. 程式人生 > >JavaScript的Function 類型

JavaScript的Function 類型

函數重載 數組 nts 優先 pro 處理 fun 面試題 試題

一,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

JavaScript的Function 類型