javascript 화살표 함수(애로우 펑션, arrow function)

2019-12-04
  • javascript
  • 화살표 함수(애로우 펑션, Arrow functions, Fat arrow functions) 는 ECMAScript 2015 의 표현식이다. function 표현에 비해 구문이 짧고, 항상 익명이며, 자신의 this/arguments/super/new.target 을 바인딩 하지 않는다.

    일단 예제

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    
    //function 표현식
    console.log(arr.filter(function(element){ return element > 3; }));
    
    //arrow function 표현식1
    console.log(arr.filter((element) => { return element > 3; }));
    
    //arrow function 표현식2 : parameter 가 하나일 때는 () 생략 가능
    console.log(arr.filter(element => { return element > 3; }));
    
    //arrow function 표현식3 : 함수가 한줄일때는 {} 생략 가능, return 생략가능.
    console.log(arr.filter(element => element > 3));
    
    //arrow function 표현식4 : 객체 리터럴을 반환하기 위해선  () 로 감싼다.
    console.log((()=>({foo:'bar'}))());
    
    

    위에서 자신의 this 를 바인딩하지 않는다는 말은

    첫번째 예제.

    var obj = {
    	name : "obj for test",
    	funcExp : function() {
    		console.dir(this);
    		return this.name;
    	},
    	funcArrowExp : () => {
    		console.dir(this);
    		return this.name;
    	},
    }
    
    //자신의 this 를 바인딩 하기 때문에 함수의 this 는 obj 변수에 바인딩 된다.
    obj.funcExp();
    VM127:4 Object
    "obj for test"
    
    //자신의 this 를 바인딩 하지 않기 때문에 window 객체가 바인딩 된다.
    obj.funcArrowExp();
    VM127:8 Window
    ""
    

    두번째 예제.

    var obj = {
    	name : "obj for test",
    	funcExp : function() {
    		setTimeout(function() {
    			console.dir(this);
    			console.log(this.name);
    		}, 1000);
    	},
    	funcArrowExp : function() {
    		setTimeout(() => {
    			console.dir(this);
    			console.log(this.name);
    		}, 1000);
    	},
    }
    
    //자신의 this 를 바인딩 하기 때문에 함수의 this 는 setTimeout 함수의 this 인 window 변수에 바인딩 된다.
    obj.funcExp();
    VM36:5 Window
    
    //자신의 this 를 바인딩 하지 않기 때문에 obj 객체가 바인딩 된다.
    obj.funcArrowExp();
    Object
    VM36:12 obj for test
    

    의도한 대로 코드가 흘러가도록 하기 위해서 Closure 을 사용할 수 도 있다.

    var obj = {
    	name : "obj for test",
    	funcExp : function() {
    		var that = this;
    		setTimeout(function() {
    				console.dir(that);
    				console.log(that.name);
    		}, 1000);
    	},
    	funcArrowExp : function() {
    		var that = this;
    		setTimeout(() => {
    		console.dir(that);
    		console.log(that.name);
    		}, 1000);
    	},
    }
    
    //아래 두 상황 모드 같은 변수를 참조한다.
    obj.funcExp();
    Object
    VM902:8 obj for test
    
    obj.funcArrowExp();
    Object
    VM902:8 obj for test
    

    참고