1. 程式人生 > >函式(三)

函式(三)

看 《 深入理解es6》 一書,有些知識點沒有記錄下來。 但大部分的知識點記錄下來了。

// 函式的一個特性
        function Person(name) {
            this.name = name;
        }


        var person = new Person("jack");
        var notAPerson = Person("jack");

        console.log(person);  // "[Object object]"
        console.log(notAPerson); // "undefined"
        //js函式中有兩個不同的內部方法, [[Call]] 和 [[Construct]] 當通過new 關鍵字呼叫函式的時,執行的是[[Construct]]函式,它負責他負責建立一個通常被稱作例項的新物件,然後在執行函式體,將this繫結到例項物件中。如果不通過則使用[[Call]]函式,從而直接執行程式碼中的函式體。 具有[[Construct]]方法的函式被統稱為建構函式  


        //  注: 不是所有的函式都有[[Construct]],箭頭函式就沒有,故箭頭函式不能被new 來呼叫  

      

// 預設引數對arguments的影響
        //在es5中 非嚴格模式下 引數的改變會直接改變arguments的值
        //        嚴格模式下   引數的改變不會影響arguments的值


        
        function mixArgs(first, second) {
            console.log(first === arguments[0]);  // true
            console.log(second === arguments[1]);  // true
            first = 'c';
            second = 'd';
            console.log(first === arguments[0]);  // true    嚴格模式 false  es6中  false
            console.log(second === arguments[1]); // true    嚴格模式 false  es6中  false
        }

        mixArgs('a', 'b');

 

        // 這個是判斷 是否為new運算子出來的例項 物件
        // 在函式外使用new.target 是一個語法錯誤

        function Person(name)  {
            // new.target
            if(typeof new.target === Person){
                this.name = name;
            }
        }

 


        // 箭頭函式
        //   1. 沒有this、super、arguments和new.target繫結 (這些值由外圍的非箭頭函式所決定)
        //   2. 不能通過new關鍵字呼叫
        //   3. 沒有原型   (因為不能通過new關鍵字來呼叫箭頭函式)
        //   4. 不可以改變this的繫結
        //   5. 不支援 arguments 物件
        //   6. 不支援重複的命名函式
        // 注: 箭頭函式的name屬性和其他函式的規則相同   
        

        // 箭頭函式沒有arguments屬性
        // let person = () => arguments[0]
        // console.log(person(5))

 

這章節有預設引數的臨時死區、無名引數、元屬性(new.target)等