1. 程式人生 > >JS Function類型

JS Function類型

表示 actor 調用函數 callee 所有 指向 this fine 字符串

每個函數都是Function類型的實例,由於函數是對象,函數名實際上是一個指向函數對象的指針,不會與某個函數綁定。

1.函數的聲明:

(1)函數聲明語法:

  function sum (num1,num2) {

    return num1 + num2;

  }

(2)函數表達式語法:

  var sum = function (num1,num2) {

    return num1+num2

  };

(3)由於函數也是對象,所以也可以用構造函數聲明

  var sum = new Function("num1","num2","return num1+num2"); // 可以接收任意數量參數,最後一個參數被看成函數體

    // 不推薦使用,因為解析了兩次代碼,首先要解析ECMAScript代碼,然後解析傳入的字符串

2.函數沒有重載

  因為函數名是指針,聲明同名函數只是改變了指針的指向

3.函數聲明與函數表達式

  函數聲明會發生變量提升,而函數表達式不會,一定得等js解析到函數所在語句才有效

4.函數內部屬性

  在函數內部,有兩個特殊的對象,arguments和this

  (1)arguments是一個類數組對象,包含著傳入函數的所有參數,主要用途是保存函數參數

    arguments對象還有一個屬性,callee 指針,指向擁有這個arguments對象的函數

    callee 可以用在遞歸中,消除函數名與函數執行緊緊耦合的現象

    比如常見遞歸  

    function factorial(num) {

      if(num <= 1) {

        return 1;

      } else {

        return num*factorial(num-1);

      }

    }

    可以把上述return 語句寫為 return num*arguments.callee(num-1)

    當函數被賦給其他變量,即有另一個指針也指向函數,此時改寫原函數,對另一個指針調用不會產生影響。

  (2)this 引用的是函數執行的環境對象,(當在網頁的全局作用域調用時this對象引用的就是window)

5.函數屬性和方法

  每個函數有兩個屬性length 和 prototype

  lengh表示函數希望接收的命名參數的個數

  方法: 設置函數體內this對象的值

  (1)apply() 接收兩個參數,一個是在其中運行函數的作用域,一個是參數數組,可以是Array實例,也可以是arguments對象

  在嚴格模式下,若沒有指定環境對象而調用函數,this值不會轉型為window,除非明確使用apply或call方法,否則this將為undefined

  (2)call()方法與apply()作用相同,他們的區別在於接收參數不同,call接收其余所有參數,傳遞的參數必須逐個列舉出來

  call 和 apply 最大的作用其實是擴充函數賴以運行的作用域

  如下例子:

    window.color = ‘red‘;

    var o = {color : ‘blue‘};

    function sayColor() {

      alert(this.color);

    }

    sayColor(); // red

    sayColor.call(this); // red

    sayColor.call(window); //red

    sayColor.call(o); // blue 

    此處sayColor()是定義在全局中的函數,自身運行輸出red很正常,

    然後通過call 綁定到this,window 都是一樣的

    最後綁定到 o 對象上 為blue 也好理解

    相比於把函數加入到o對象中 o.sayColor = sayColor

   這種方法解除了 方法與對象的聯系(耦合)

  (3)ECMAScript5 還定義了一個bind()方法,會創建一個函數的實例,其this值會被綁定到傳給bind()函數的值

    window.color = ‘red‘;

    var o = {color: "blue"};

    function sayColor () {

      alert(this.color)

    }

    var objectSayColor = sayColor.bind(o);

    objectSayColor(); //blue

    this值被綁定到o對象上,然後通過sayColor創建的實例賦給objectSayColor,所以objectSayColor 函數的this值也為o

JS Function類型