ES6學習之函數的擴展

clipboard.png

  1. ES6容許爲函數的參數設置默認值,即直接寫在參數定義的後面。
    1.1. 指定了默認值之後,函數的length屬性,將返回沒有指定默認值的參數個數。也就是說,指定了默認值後,length屬性將失真。
    1.2. 一旦設置了參數的默認值,函數進行聲明初始化時,參數會造成一個單獨的做用域(context)。等到初始化結束,這個做用域就會消失。
  2. ES6 引入rest參數(「...變量名」),用於獲取函數的多餘參數,這樣就不須要使用arguments對象了。rest參數搭配的變量是一個數組,該變量將多餘的參數放入數組中。javascript

    function add(...values) {
      let sum = 0;
      for (var val of values) {
            sum += val;
      }
      return sum;
    }
    add(2, 5, 3) // 10
  3. 新增了擴展運算符三個點(...),用於將一個數組轉爲用逗號分隔的參數序列。java

    console.log(...[1, 2, 3])// 1 2 3
  4. ES6規定只要函數參數使用了默認值、解構賦值、或者擴展運算符,那麼函數內部就不能顯式設定爲嚴格模式,不然會報錯。
  5. 新增函數的name屬性,返回該函數的函數名。數組

    function foo() {}
    console.log(foo.name);// "foo"
  6. ES6容許使用「箭頭」(=>)定義函數。這裏重點講解。
    6.1. 箭頭函數是什麼?閉包

    箭頭函數使函數定義簡潔化
     ```javascript
         var f = () => 'It's a test.';
     ```
     與
     ```javascript
         var f = function (){
             return 'It's a test.'
         }
     ```
     是同樣的意思。

    6.2. 箭頭函數有什麼做用?函數

    在ES5的時候,函數this的值和調用這個函數的上下文有關。
      當咱們在js裏寫了閉包,匿名函數等,this指向會發生改變,致使
      沒法找到對應做用域的相關變量或函數。以setTimeout爲例:
      ```javascript
          var test='測試';
          function f() {
               setTimeout(function(){
                     console.log(this.test);
               }, 100);
         }
         f.call({test:'哈哈'});//測試
      ```
     以上輸出的結果是測試,setTimeout是在全局做用域下執行的,this指向的是全局
      window,而window上test的值爲"測試",因此輸出的是測試。
      ```javascript
          var test='測試';
          function f() {
               setTimeout(() => {
                     console.log(this.test);
               }, 100);
         }
         f.call({test:'哈哈'});//哈哈
      ```
     以上輸出的結果是哈哈,setTimeout是在全局做用域下執行的,this指向的是全局
     window,而箭頭函數致使this老是指向函數定義生效時所在的對象,這裏是指
     {test:'哈哈'},因此輸出的是哈哈。
              
      因而可知箭頭函數可讓this指向固定化,this在定義的時候就肯定好的,之後
      無論怎麼調用這個箭頭函數,箭頭函數的this始終爲定義時的this,這種特性很
      有利於封裝回調函數。

    6.3 箭頭函數使用注意點?學習

    6.3.1 不可使用arguments對象,該對象在函數體內不存在。
      6.3.2 不綁定this。
      6.3.3 不能夠看成構造函數,也就是說,不可使用new命令。
      6.3.4 不可使用yield命令,所以箭頭函數不能用做Generator函數。

    學習於http://jsrun.net/tutorial/tZKKp測試

相關文章
相關標籤/搜索