1. 程式人生 > >JavaScript 整理筆記(四)

JavaScript 整理筆記(四)

1.3 函式

1.3.1 函式物件

Javascript 中的函式也是物件。函式物件連線到Function.prototype,該原型物件本身
連線到 Object.prototype。
每個函式物件在建立時會有一個prototype屬性。它的值是一個擁有 constructor 屬性
且值為該函式的物件。
例:
    function a(){};
    a.prototype.constructor;  // function a(){}

函式的不同之處在於它可以被呼叫。
例:
    a(); // 呼叫函式a

1.3.2 函式字面量

函式物件通過函式字面量來建立:
    var reduce = function(a, b){
        return a - b;
    }

1.3.3 呼叫

4種呼叫模式:
    方法呼叫模式
        當一個函式被儲存為物件的一個屬性時,則稱其為物件的一個方法。當被呼叫是this被繫結到該物件。
            var obj =  {
                sum: 0,
                add: function(num){
                    this.sum += num || 1;
                }
            }
            obj.add();
            obj.sum; // 1
            obj.add(2);
            obj.sum; // 3
        通過this可取的該物件的上下文的方法稱為公共方法。

    函式呼叫模式
        當一個函式不是一個物件的屬性時,那麼該函式被當做一個函式來呼叫:
            function add(a, b){
                return a + b;
            }
            var sum = add(1, 2);
            sum; // 3
        此模式呼叫函式時,this會被繫結到全域性物件。這是語言設計上的錯誤。
        我們一般通過定義一個變數來給它賦值this。一般是 that 或 _this。
            obj.add2 = function(){
                var that = this;
                var a = function(){
                    that.sum = add(that.sum, that.sum);
                }
                a(); // 6
                var b = function(){
                    this.sum = add(this.sum, this.sum);
                }
                b(); // undefined 該函式中sum為undefined
            }
            obj.add2();

    構造器呼叫模式
        建構函式約定是以大寫格式命名函式名的函式,通過new來呼叫,但是不加上new,也不會警告,
        這個很蛋疼。
        在上述面前加new來呼叫時,會預設建立一個連線到該函式的prototype成員的新物件,同時this
        也會繫結到這個新物件上。
            var Fn = function(value){
                this.value = value;
            };
            Fn.prototype.getValue = function(){
                return this.value;
            }
            var fn = new Fn(1001);
            fn.getValue(); // 1001

    apply呼叫模式
        apply方法會構建一個引數陣列傳遞給呼叫函式。也允許選擇this的值。
        var arr = [1, 2];
        var sum = add.apply(this, arr);
        sum; // 3
        var sum2 = add.apply(null, arr);
        sum2; // 3

        var o = {
            value: 2002
        };
        var value = Fn.prototype.getValue.apply(o);
        value; // 2002
        // apply 會把 this 指向 o , 所以會返回 this.value 即 o.value;

每個函式除了宣告定義的形式引數,還接收附加的兩個引數:
    this       - 值取決於呼叫的模式
    arguments  - 函式的實際引數個數,類似陣列,但不是陣列

呼叫函式時函式引數個數不匹配是不會導致執行錯誤,多的引數會被忽略,少的引數會預設是undefined。
例:
    function add3(a, b, c) {
        console.log("" + a + b + c);
    }
    add3(1, 2, 3, 4); // 123
    add3(1, 2); // 12undefined

——–內容繫個人整理,如有錯誤,歡迎指出。謝謝!——–