화살표 함수를 다시 살펴보겠습니다.
화살표 함수는 단지 작은 내용을 작성하기 위한 "약칭"이 아닙니다. 여기에는 매우 구체적이고 유용한 기능이 있습니다.
JavaScript에는 다른 곳에서 실행되는 작은 함수를 작성해야 하는 상황이 많이 있습니다.
예를 들어:
arr.forEach(func)
– func
모든 배열 항목에 대해 forEach
에 의해 실행됩니다.
setTimeout(func)
– func
내장 스케줄러에 의해 실행됩니다.
…더 있습니다.
함수를 생성하고 어딘가에 전달하는 것은 JavaScript의 정신입니다.
그리고 그러한 기능에서 우리는 일반적으로 현재 컨텍스트를 벗어나고 싶지 않습니다. 화살표 기능이 유용한 곳입니다.
객체 메서드 "this" 장에서 기억했듯이 화살표 함수에는 this
없습니다. this
에 접근하면 외부에서 가져옵니다.
예를 들어, 객체 메서드 내부를 반복하는 데 사용할 수 있습니다.
그룹 = { title: "우리 그룹", 학생: ["John", "Pete", "Alice"], 쇼리스트() { this.students.forEach( 학생 => 경고(this.title + ': ' + 학생) ); } }; group.showList();
forEach
에서는 화살표 함수가 사용되므로 this.title
은 외부 메서드 showList
와 정확히 동일합니다. 즉, group.title
입니다.
"일반" 함수를 사용하면 오류가 발생합니다.
그룹 = { title: "우리 그룹", 학생: ["John", "Pete", "Alice"], 쇼리스트() { this.students.forEach(함수(학생) { // 오류: 정의되지 않은 'title' 속성을 읽을 수 없습니다. Alert(this.title + ': ' + 학생); }); } }; group.showList();
이 오류는 forEach
기본적으로 this=undefined
으로 함수를 실행하기 때문에 발생하며, undefined.title
에 액세스하려는 시도가 이루어집니다.
이는 화살표 기능에 영향을 미치지 않습니다. 왜냐하면 화살표 기능에는 this
없기 때문입니다.
화살표 기능은 new
으로 실행할 수 없습니다
this
없다는 것은 당연히 또 다른 제한을 의미합니다. 화살표 함수는 생성자로 사용할 수 없습니다. new
로 호출할 수 없습니다.
화살표 함수 VS 바인드
화살표 함수 =>
와 .bind(this)
로 호출되는 일반 함수 사이에는 미묘한 차이가 있습니다.
.bind(this)
함수의 "바운드 버전"을 생성합니다.
화살표 =>
는 바인딩을 생성하지 않습니다. 이 함수에는 this
없습니다. this
의 조회는 외부 어휘 환경에서 일반 변수 검색과 정확히 동일한 방식으로 이루어집니다.
화살표 함수에는 arguments
변수도 없습니다.
이는 현재 this
및 arguments
사용하여 호출을 전달해야 할 때 데코레이터에게 좋습니다.
예를 들어 defer(f, ms)
함수를 가져오고 ms
밀리초만큼 호출을 지연시키는 래퍼를 반환합니다.
함수 defer(f, ms) { 반환 함수() { setTimeout(() => f.apply(this, 인수), ms); }; } 함수 sayHi(누구) { Alert('안녕하세요, ' + 누구); } let sayHiDeferred = defer(sayHi, 2000); sayHiDeferred("John"); // 안녕하세요, John 2초 후에
화살표 기능이 없으면 다음과 같습니다.
함수 defer(f, ms) { 반환 함수(...args) { ctx = this라고 놔두세요; setTimeout(함수() { f.apply(ctx, args)를 반환합니다. }, ms); }; }
여기서는 setTimeout
내부의 함수가 이를 사용할 수 있도록 추가 변수 args
및 ctx
생성해야 했습니다.
화살표 기능:
this
없어
arguments
없습니다.
new
호출할 수 없습니다.
그들은 또한 super
가지고 있지 않습니다. 그러나 우리는 아직 그것을 연구하지 않았습니다. 클래스 상속 장에 대해 설명하겠습니다.
그 이유는 자체 "컨텍스트"가 없고 오히려 현재 코드에서 작동하는 짧은 코드 조각을 위한 것이기 때문입니다. 그리고 그 사용 사례에서 정말 빛을 발합니다.