天天看點

Javascript中的箭頭函數箭頭函數

Javascript中的箭頭函數

  • 箭頭函數
    • 參數
      • 不傳參數
      • 隻傳入一個參數
      • 傳入兩個及兩個以上的參數
      • 支援預設參數、剩餘參數及參數的解構
    • 函數體
    • 箭頭函數中的this
    • 箭頭函數内定義的變量及其作用域
    • 其他

箭頭函數

特點:比函數表達式更簡潔,并且沒有自己的this,arguments,super或new.target。

适用于:那些本來需要匿名函數的地方,并且它不能用作構造函數

注意:

  • 箭頭函數不能用作構造器,和 new一起用會抛出錯誤。
  • 箭頭函數沒有prototype屬性。為undefined
  • yield 關鍵字通常不能在箭頭函數中使用(除非是嵌套在允許使用的函數内)。是以,箭頭函數不能用作函數生成器。

參數

不傳參數

沒有參數的函數應該寫成一對圓括号,() => { statements }

//函數普通寫法
	funtion foo()
	{
		console.log("函數普通寫法");
	} 
           
//沒有參數的函數應該寫成一對圓括号
	let fun =()=>console.log("箭頭函數_不傳參數");
	fun();
           

隻傳入一個參數

當隻有一個參數時,圓括号是可選的

(singleParam) => { statements } 或者 singleParam => { statements }

let fun1=(a)=>console.log(`箭頭函數傳入一個參數,值為:${a}`);
	//可以省略()
	let fun2= a =>console.log(`箭頭函數傳入一個參數,值為:${a}`);
	fun1("1");
	fun2("2");
           

傳入兩個及兩個以上的參數

(param1, param2, …, paramN) => { statements }

let fun3=(a,b)=>console.log(`箭頭函數兩個及兩個以上的形參,值為:${a}和${b}`);
	fun3("a","b");
	
           

支援預設參數、剩餘參數及參數的解構

ES6中預設參數和剩餘參數的注意事項 : https://blog.csdn.net/liuli_a/article/details/104679155

預設參數

(param = defaultValue) => { statements }

let fun4=(param1=100)=>console.log(param1);
	//100
	console.log(fun4());
	
           

剩餘參數

(param1, param2, …rest) => { statements }

let fun5=(param1,param2,param3,...params)=>{
		console.log(param1);
		console.log(param2);
		console.log(param3);
		console.log(params);
	}
	
	//1
	//2
	//3
	//[4,5,6,7,8,9]
	
	fun5(1,2,3,4,5,6,7,8,9);
	
           

參數的解構

( [a,b] = [1,2] ) => a+b

let fun6=([num1,num2]=[1,9],[num3]=[num1+num2])=>num1+num2+num3;
	//20
	console.log(fun6());  
	
           

函數體

函數體隻有一條語句或者是表達式的時候 可以省略 { } ,當省略 { } 時,會自動傳回語句執行結果或是表達式結果

箭頭函數的簡寫

//省略{}
	let fun7=(x,y)=>x+y;
	//3
	console.log(fun7(1,2));
           

函數體不止一條語句時, { } 不可以省略

箭頭函數的正常寫法

//{ } 不可以省略
	let  fun8=(x,y)=>{
			x=x.toString();
			y=y.toString();
			return x+y;
	}
	console.log(fun8(1,5)); //15
           

在一個簡寫體中,隻需要一個表達式,并自動附加一個隐式的傳回值。在正常寫法中,必須使用明确的return語句。

箭頭函數中的this

箭頭函數不會建立自己的this,它隻會從自己的作用域鍊的上一層繼承this

通過 call() 或 apply() 方法調用一個函數時,隻能傳遞參數

var adder = {
	  base : 1,
	  
	  add : function(a) {
	    var f = v => v + this.base;
	    return f(a);
	  },
	
	  addThruCall: function(a) {
	 
	    var f = v => v + this.base;
	    var b = {
	      base : 2
	    };
	    
	     //由于箭頭函數沒有自己的this指針,通過 call() 或 apply() 方法調用一個函數時,隻能傳遞參數    
	    return f.call(b, a);
	  }
	};
	
	console.log(adder.add(1));         // 輸出 2
	console.log(adder.addThruCall(1)); // 仍然輸出 2

           

箭頭函數内定義的變量及其作用域

  • 參數括号内定義的變量是局部變量
  • 函數體内 { } 不使用var定義的變量是全局變量
  • 函數體内{} 用var定義的變量是局部變量

其他

箭頭函數在參數和箭頭之間不能換行。

var func = ()
           => 1; 
//SyntaxError: expected expression, got '=>'
           

但是,可以通過在 ‘=>’ 之後換行,或者用 ‘( )’、’{ }'來實作換行

var func = (a, b, c) =>
  1;

var func = (a, b, c) => (
  1
);

var func = (a, b, c) => {
  return 1
};
           

繼續閱讀