es6函數

  1. 默認參數

    function add(num1,num2 = 0,callback = function(){}){ // es6 默認參數
    	num1 = (typeof num1 === 'number') ? num1 : 0; // es5默認參數
    	num2 = (typeof num2 === 'number') ? num2 : 0; // es5默認參數
    	callback();
    	return num1 + num2;
    }
    
  2. 默認參數與arguments

    function add(num1,num2 = 0){ 
    	console.log(num1 === arguments[0]);//true
    	console.log(num2 === arguments[1]);//true
    	num1 = 2;
    	num2 = 2;
    	console.log(num1 === arguments[0]);// ?
    	console.log(num2 === arguments[1]);// ?
    	return num1 + num2;
    }
    

    es5非嚴格模式,爲true,參數重新賦值會導致arguments改變;嚴格模式以及es6,都爲false,arguments不跟隨變化。

  3. 不定參數 function(…values);function(…values,value)//error。

  4. Function 構造函數,接收字符串創建函數,接收參數和函數體。es6的函數構造函數增加了不定參數,默認參數的函數的構造。

  5. 展開運算符 …values。可將數組展開。

    var obj = {};
    function func(v1,v2,v3){};
    var arr = [1,2,3];
    func.call(obj,...values);
    func.apply(obj,values);
    
  6. new.taget 判斷函數是否以new 進行調用。如果不爲undefined,則證明函數是以構造函數的形式進行調用的。

  7. 箭頭函數。箭頭函數的arguments,this,new.target都由最近一層非箭頭函數(執行環境)決定,保持一致並不可更改。

    function Car(){
        this.move = function(){
            console.log('123123')
        }
        this.onStart = function(){
            document.addEventListener('click',function(e){this.move()});//move is undefine
             document.addEventListener('click',(e)=>{this.move()});//ok
        }
    }
    
    var car = new Car();
    car.onStart();
    
    

    function(e){this.move()}由document對象進行調用,所以this指向document,但是document沒有move方法,所以會報錯。採用箭頭函數的寫法,this會綁定到onstart的this,就是car對象,代碼可正常執行。箭頭函數的this是不會被改變的,也就是call,bind,apply並不能改變箭頭函數的this指向。

  8. 尾調用優化

    	function factorialBetter(n,result=1){
    	    if(n<=1){
    	        return 1*result;
    	    }else{
    	        result = n*result;
    	        return factorialBetter(n-1,result);
    	    }
    	}
    	
    	// 尾遞歸 
    	function factorialBetter(n,result=1){
    	    if(n<=1){
    	        return 1*result;
    	    }else{
    	        result = n*result;
    	        return factorialBetter(n-1,result);
    	    }
    	}
    

    尾遞歸滿足條件:
    - 尾遞歸不是一個閉包,沒有訪問外部作用域的變量。
    - 尾調用是最後一條語句。
    - 尾調用作爲結果返回。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章