JavaScript에서 "=>"의 의미는 무엇입니까?


444

>=연산자가 의미 이상이라는 것을 알고 있지만 =>일부 소스 코드에서 보았습니다 . 그 연산자의 의미는 무엇입니까?

코드는 다음과 같습니다.

promiseTargetFile(fpParams, aSkipPrompt, relatedURI).then(aDialogAccepted => {
    if (!aDialogAccepted)
        return;

    saveAsType = fpParams.saveAsType;
    file = fpParams.file;

    continueSave();
}).then(null, Components.utils.reportError);

5
화살표 기능 에 대한이 링크를 참조하십시오 .
Mistalis

답변:


547

그것은 무엇인가

이것은 화살표 기능입니다. 화살표 함수는 ECMAscript 6에 도입 된 짧은 구문으로, 함수 표현식을 사용하는 방식과 유사하게 사용할 수 있습니다. 다시 말해, 종종 같은 식 대신에 사용할 수 있습니다 function (foo) {...}. 그러나 몇 가지 중요한 차이점이 있습니다. 예를 들어, 그들은 자신의 가치를 묶지 않습니다 this(토론은 아래를 참조하십시오).

화살표 기능은 ECMAscript 6 사양의 일부입니다. 모든 브라우저에서 아직 지원되지는 않지만 Node v. 4.0 이상 및 2018 년 현재 사용중인 대부분의 최신 브라우저에서 부분적으로 또는 완전히 지원 됩니다 (아래에는 지원되는 브라우저의 일부 목록이 포함되어 있음).

화살표 기능 에 대해서는 Mozilla 설명서 를 참조하십시오 .

Mozilla 문서에서 :

(또한 지방 화살표 함수라고도 함) 화살표 함수 표현식에 비해 짧은 구문 함수식 및 어휘 바인드 this값 (결합하지 않는 그 자체를 this, arguments, super, 또는 new.target). 화살표 기능은 항상 익명입니다. 이 함수 표현식은 비 메소드 함수에 가장 적합하며 생성자로 사용할 수 없습니다.

this화살표 기능의 작동 방식에 대한 참고 사항

화살표 기능의 가장 편리한 기능 중 하나는 위의 텍스트에 묻혀 있습니다.

화살표 함수 ... 어휘 적으로 this값을 바인딩합니다 (자체 바인딩하지 않습니다 this...)

더 간단한 용어로 화살표 기능 this은 컨텍스트 의 값을 유지하며 자체 값이 없다는 것 this입니다. 전통적인 함수 는 정의 및 호출 방식에 따라 자체 값을 바인딩 할 수 있습니다this . 이것은 다른 함수 내의 한 함수에서 self = this;액세스하거나 조작하기 위해 많은 체조가 필요할 수 있습니다 this. 이 주제에 대한 자세한 정보 는 Mozilla 문서의 설명 및 예제를 참조하십시오 .

예제 코드

예 (문서에서도) :

var a = [
  "We're up all night 'til the sun",
  "We're up all night to get some",
  "We're up all night for good fun",
  "We're up all night to get lucky"
];

// These two assignments are equivalent:

// Old-school:
var a2 = a.map(function(s){ return s.length });

// ECMAscript 6 using arrow functions
var a3 = a.map( s => s.length );

// both a2 and a3 will be equal to [31, 30, 31, 31]

호환성에 대한 참고 사항

노드에서 화살표 기능을 사용할 수 있지만 브라우저 지원은 드문 경우입니다.

이 기능에 대한 브라우저 지원은 상당히 개선되었지만 여전히 대부분의 브라우저 기반 사용에는 충분하지 않습니다. 2017 년 12 월 12 일부터 현재 버전에서 지원됩니다.

  • 크롬 (v. 45+)
  • 파이어 폭스 (v. 22+)
  • 가장자리 (v. 12+)
  • 오페라 (v. 32+)
  • 안드로이드 브라우저 (v. 47+)
  • 오페라 모바일 (v. 33+)
  • Android 용 Chrome (v. 47+)
  • Android 용 Firefox (v. 44+)
  • 사파리 (10 절 이상)
  • iOS Safari (v. 10.2 이상)
  • 삼성 인터넷 (v.5 이상)
  • 바이두 브라우저 (v. 7.12+)

다음에서 지원되지 않습니다.

  • IE (v. 11을 통해)
  • 오페라 미니 (버전 8.0을 통해)
  • 블랙 베리 브라우저 (v. 10까지)
  • IE 모바일 (v. 11)
  • Android 용 UC 브라우저 (v. 11.4를 통해)
  • QQ (버전 1.2를 통해)

CanIUse.com 에서 더 많은 (및 더 최신) 정보를 찾을 수 있습니다 (가맹 없음).


3
TypeScript도 지원하는 것 같습니다.
mtyson

1
이것이 람다 식인 것 같습니다.
Addem

1
브라우저 호환성 측면에서 언급하고 싶었지만 ES6 / ES7 화살표 기능과 IE11과 호환되지 않는 다른 기능을 사용하지만 ES6을 ES5로 변환하기 위해 Guel 또는 Webpack을 Babel과 함께 사용하여 IE11에서 작동합니다. 따라서 IE11 지원이 필요하고 Babel을 설정하는 데 신경 쓰지 않으면 계속하십시오.
mbokil

76

그것은 ECMAScript 2015 사양의 일부인 화살표 기능으로 알려져 있습니다 ...

var foo = ['a', 'ab', 'abc'];

var bar = foo.map(f => f.length);

console.log(bar); // 1,2,3

이전보다 짧은 구문 :

// < ES6:
var foo = ['a', 'ab', 'abc'];

var bar = foo.map(function(f) {
  return f.length;
});
console.log(bar); // 1,2,3

데모

또 다른 멋진 것은 어휘입니다 this ... 일반적으로 다음과 같은 작업을 수행합니다.

function Foo() {
  this.name = name;
  this.count = 0;
  this.startCounting();
}

Foo.prototype.startCounting = function() {
  var self = this;
  setInterval(function() {
    // this is the Window, not Foo {}, as you might expect
    console.log(this); // [object Window]
    // that's why we reassign this to self before setInterval()
    console.log(self.count);
    self.count++;
  }, 1000)
}

new Foo();

그러나 다음과 같이 화살표로 다시 작성할 수 있습니다.

function Foo() {
  this.name = name;
  this.count = 0;
  this.startCounting();
}

Foo.prototype.startCounting = function() {
  setInterval(() => {
    console.log(this); // [object Object]
    console.log(this.count); // 1, 2, 3
    this.count++;
  }, 1000)
}

new Foo();

데모

구문에 대한 MDN
추가 정보

자세한 내용은 여기 에 꽤 좋은 답변 할 때 기능을 화살표 사용하는가.


그것은 사용에 대한 데모 업데이트하는 것이 좋을 것 esfiddle.net을 같이 es6fiddle.net가 더 이상 작동하지 않습니다
Wavesailor

25

이것은 ECMAScript 6에 도입 된 "화살표 함수 표현식"입니다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/arrow_functions

역사적인 목적으로 (위키 페이지가 나중에 변경되는 경우) 다음과 같습니다.

화살표 함수 표현식은 함수 표현식에 비해 구문이 짧으며이 값을 어휘 적으로 바인딩합니다. 화살표 기능은 항상 익명입니다.


1
충분한 정보를 포함하여 대부분의 독자가 드릴 다운 할 필요가 없습니까?
djechlin

2
"위키 함수 표현식은 함수 표현식에 비해 구문이 짧고이 값을 어휘 적으로 바인딩합니다. 화살표 함수는 항상 익명입니다."
Kyle Falconer

1
여기에 인용문으로 추가하면 실제로 답변에 도움이됩니다.
Hanky ​​Panky

22

이들은 화살표 기능입니다

Fat Arrow Functions 라고도 합니다. 예를 들어, 함수 표현식을 작성하는 깔끔하고 간결한 방법 function() {}입니다.

화살표 기능의 필요성을 제거 할 수 있습니다 function, return{}기능을 정의 할 때. Java 또는 Python의 Lambda Expressions와 비슷한 하나의 라이너입니다.

매개 변수가없는 예

const queue = ['Dave', 'Sarah', 'Sharon'];
const nextCustomer = () => queue[0];

console.log(nextCustomer()); // 'Dave'

동일한 화살표 함수 내에서 여러 명령문을 작성해야하는 경우이 예제에서는 queue[0]컬리 괄호로 묶어야 {}합니다. 이 경우 return 문을 생략 할 수 없습니다.

1 개의 매개 변수가있는 예

const queue = ['Dave', 'Sarah', 'Sharon'];
const addCustomer = name => {
  queue.push(name);
};

addCustomer('Toby');

console.log(queue); // ['Dave', 'Sarah', 'Sharon', 'Toby']

{}위에서 생략 할 수 있습니다 .

단일 매개 변수가있는 ()경우 매개 변수 주위의 대괄호 를 생략 할 수 있습니다.

여러 매개 변수가있는 예

const addNumbers = (x, y) => x + y

console.log(addNumbers(1, 5)); // 6

유용한 예

const fruits = [
    {name: 'Apple', price: 2},
    {name: 'Bananna', price: 3},
    {name: 'Pear', price: 1}
];

ES5에서 모든 과일의 가격을 단일 배열로 얻으려면 다음과 같이하십시오.

fruits.map(function(fruit) {
    return fruit.price;
}); // [2, 3, 1]

새로운 Arrow Functions가 포함 된 ES6에서는이를보다 간결하게 만들 수 있습니다.

fruits.map(fruit => fruit.price); // [2, 3, 1]

화살표 기능에 대한 추가 정보는 여기를 참조하십시오 .

브라우저 호환성

  • IE : 아직 지원되지 않음
  • 가장자리 : 12+ (모든 버전)
  • 파이어 폭스 : 22+
  • 크롬 : 45+
  • 사파리 : 10+
  • iOS 사파리 : 10.2+
  • 안드로이드 브라우저 : 56+

추가 최신 정보는 브라우저 호환성 에서 확인할 수 있습니다.


21

map을 사용하지 않고 람다가 할 수있는 일에 대한 또 다른 예를 추가하려면 다음을 수행하십시오.

a = 10
b = 2

var mixed = (a,b) => a * b; 
// OR
var mixed = (a,b) => { (any logic); return a * b };

console.log(mixed(a,b)) 
// 20

13

다른 사람들이 말했듯이 함수를 만드는 새로운 구문입니다.

그러나 이런 종류의 기능은 일반 기능과 다릅니다.

  • 그들은 this가치를 묶습니다 . 사양 에서 설명했듯이

    ArrowFunction는 로컬 바인딩을 정의하지 않는다 arguments, super, this, 또는 new.target. 모든 참조하는 arguments, super, this, 또는 new.targetArrowFunction는 A A 어휘 둘러싸는 환경의 결합으로 해결해야합니다. 일반적으로 이것은 즉시 둘러싸는 기능의 기능 환경입니다.

    짝수 비록 ArrowFunction가 참조를 포함 할 수있다 super, 단계 (4)에서 생성 된 함수 목적 수행에 의한 방법으로 제조되지 MakeMethod를 . ArrowFunction 참조가 super 항상 비 내에 포함 ArrowFunction 구현하고 필요한 상태 super비아 액세스 범위 의 함수 객체에 의해 캡처 ArrowFunction .

  • 그들은 비 생성자입니다.

    즉, [[Construct]] 내부 메소드가 없으므로 인스턴스화 할 수 없습니다. 예 :

    var f = a => a;
    f(123);  // 123
    new f(); // TypeError: f is not a constructor

8

나는 이것이의 상징, 읽은 Arrow Functions에서ES6

var a2 = a.map(function(s){ return s.length });

사용하여 Arrow Function쓸 수 있습니다

var a3 = a.map( s => s.length );

MDN 문서


6

Arrowfunction으로 간단한 CRUD 예제 추가

 //Arrow Function
 var customers   = [
   {
     name: 'Dave',
     contact:'9192631770'
   },
   {
     name: 'Sarah',
     contact:'9192631770'
   },
   {
     name: 'Akhil',
     contact:'9928462656' 
   }],

// No Param READ
 getFirstCustomer = () => { 
   console.log(this);
   return customers[0];
 };
  console.log("First Customer "+JSON.stringify(getFirstCustomer())); // 'Dave' 

   //1 Param SEARCH
  getNthCustomer = index=>{
    if( index>customers.length)
    {
     return  "No such thing";
   }
   else{
       return customers[index];
     } 
  };
  console.log("Nth Customer is " +JSON.stringify(getNthCustomer(1))); 

   //2params ADD
  addCustomer = (name, contact)=> customers.push({
     'name': name,
     'contact':contact
    });
  addCustomer('Hitesh','8888813275');
  console.log("Added Customer "+JSON.stringify(customers)); 

  //2 param UPDATE
  updateCustomerName = (index, newName)=>{customers[index].name= newName};
  updateCustomerName(customers.length-1,"HiteshSahu");
  console.log("Updated Customer "+JSON.stringify(customers));

  //1 param DELETE
  removeCustomer = (customerToRemove) => customers.pop(customerToRemove);
  removeCustomer(getFirstCustomer());
  console.log("Removed Customer "+JSON.stringify(customers)); 

4

다른 답변에 불만족했습니다. 2019 년 3 월 13 일 현재 가장 많이 투표 된 답변은 사실 틀 렸습니다.

무엇의 짧은 간결한 버전 =>의미는 함수를 작성하는 지름길입니다 현재에 바인딩this

const foo = a => a * 2;

효과적으로 지름길입니다

const foo = function(a) { return a * 2; }.bind(this);

단축 된 모든 것을 볼 수 있습니다. 우리는 괄호 나 괄호 가 필요 function하지도 return않았고.bind(this)

화살표 함수의 약간 더 긴 예는 다음과 같습니다.

const foo = (width, height) => {
  const area = width * height;
  return area;
};

함수에 여러 개의 인수를 원하면 괄호가 필요하고 하나 이상의 표현식을 쓰려면 중괄호와 명시 성이 필요하다는 것을 보여 return줍니다.

.bind부분 을 이해하는 것이 중요 하며 큰 주제입니다. 그것은 무엇을 함께 할 수있다 this자바 스크립트에 의미합니다.

모든 함수에는이라는 암시 적 매개 변수가 this있습니다. this함수를 호출 할 때 설정되는 방법 은 해당 함수의 호출 방법에 따라 다릅니다.

갖다

function foo() { console.log(this); }

정상적으로 전화하면

function foo() { console.log(this); }
foo();

this 전역 객체가됩니다.

엄격 모드 인 경우

`use strict`;
function foo() { console.log(this); }
foo();

// or

function foo() {
   `use strict`;
   console.log(this);
 }
foo();

될 것입니다 undefined

당신은 설정할 수 있습니다 this사용하여 직접 call또는apply

function foo(msg) { console.log(msg, this); }

const obj1 = {abc: 123}
const obj2 = {def: 456}

foo.call(obj1, 'hello');  // prints Hello {abc: 123}
foo.apply(obj2, ['hi']);  // prints Hi {def: 456}

this도트 연산자를 사용하여 암시 적으로 설정할 수도 있습니다.

function foo(msg) { console.log(msg, this); }
const obj = {
   abc: 123,
   bar: foo,
}
obj.bar('Hola');  // prints Hola {abc:123, bar: f}

함수를 콜백이나 리스너로 사용하려고하면 문제가 발생합니다. 클래스를 만들고 클래스의 인스턴스에 액세스하는 콜백으로 함수를 할당하려고합니다.

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click', function() {
       console.log(this.name);  // won't work
    }); 
  }
}

요소가 이벤트를 발생시키고 함수를 호출 할 때 this값이 클래스의 인스턴스가 아니므로 위의 코드는 작동 하지 않습니다.

이 문제를 해결하는 일반적인 방법 중 하나는 .bind

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click', function() {
       console.log(this.name); 
    }.bind(this); // <=========== ADDED! ===========
  }
}

화살표 구문은 우리가 쓸 수있는 것과 같은 일을하기 때문에

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click',() => {
       console.log(this.name); 
    });
  }
}

bind효과적으로 새로운 기능을 만듭니다 . 경우 bind당신은 기본적으로 다음과 같이 자신을 만들 수있는 존재하지 않았다

function bind(funcitonToBind, valueToUseForThis) {
  return function(...args) {
    functionToBind.call(valueToUseForThis, ...args);
  };
}

스프레드 연산자가없는 오래된 JavaScript에서는

function bind(funcitonToBind, valueToUseForThis) {
  return function() {
    functionToBind.apply(valueToUseForThis, arguments);
  };
}

코드를 이해하려면 클로저에 대한 이해가 필요 하지만 짧은 버전은 bind항상 원래 함수를 this바인딩 된 값으로 호출하는 새로운 함수입니다 . 화살표 기능은 바로 가기이므로 동일한 기능을 수행합니다.bind(this)


2

다른 모든 답변이 이미 말했듯이 ES2015 화살표 함수 구문의 일부입니다. 더 구체적으로 말하면 연산자가 아니며 본문과 매개 변수를 구분하는 구두점 토큰입니다 ArrowFunction : ArrowParameters => ConciseBody. 예 (params) => { /* body */ }.


1

ES6 화살표 기능 :

자바 스크립트에서는 =>화살표 함수 표현식의 상징입니다. 화살표 함수 표현식에는 자체 this바인딩이 없으므로 생성자 함수로 사용할 수 없습니다. 예를 들면 다음과 같습니다.

var words = 'hi from outside object';

let obj = {
  words: 'hi from inside object',
  talk1: () => {console.log(this.words)},
  talk2: function () {console.log(this.words)}
}

obj.talk1();  // doesn't have its own this binding, this === window
obj.talk2();  // does have its own this binding, this is obj

화살표 기능 사용 규칙 :

  • 이 경우 정확히 하나 개의 인수는 인수의 괄호를 생략 할 수 있습니다.
  • 식을 반환하고 같은 줄 에서이 작업을 수행하면 {}return문을 생략 할 수 있습니다

예를 들면 다음과 같습니다.

let times2 = val => val * 2;  
// It is on the same line and returns an expression therefore the {} are ommited and the expression returns implictly
// there also is only one argument, therefore the parentheses around the argument are omitted

console.log(times2(3));


1

기호 (=>)로 표시된 화살표 기능을 사용하면 익명 함수 및 메소드를 작성할 수 있습니다. 구문이 더 짧아집니다. 예를 들어, 아래는 두 숫자의 더하기를 반환하는 간단한 "추가"기능입니다.

function Add(num1 , num2 ){
return num1 + num2;
}

위의 기능은 아래와 같이“화살표”구문을 사용하여 짧아집니다.

여기에 이미지 설명을 입력하십시오

위의 코드는 위의 다이어그램과 같이 두 부분으로 구성됩니다.-

입력 : —이 섹션은 익명 함수에 대한 입력 매개 변수를 지정합니다.

논리 : —이 부분은“=>”기호 뒤에옵니다. 이 섹션에는 실제 기능의 논리가 있습니다.

많은 개발자들은 화살표 함수가 구문을 더 짧고 간단하게하여 코드를 읽을 수있게한다고 생각합니다.

위의 문장을 믿는다면 그것이 신화임을 확신시켜 드리겠습니다. 잠깐 생각하면 이름으로 올바르게 작성된 함수는 화살표 기호를 사용하여 한 줄로 작성된 암호 함수보다 훨씬 읽기 쉽습니다.

화살표 기능의 주요 용도는 코드가 호출자 컨텍스트에서 실행되도록하는 것입니다.

전역 변수 "context"가 정의 된 아래 코드를 참조하십시오.이 전역 변수는 다른 메소드 "SomeMethod"에서 호출되는 "SomeOtherMethod"함수 내에서 액세스됩니다.

이 "SomeMethod"에는 로컬 "context"변수가 있습니다. "SomeOtherMethod"는 ""SomeMethod "에서 호출되므로"local context "는 표시되지만"global context "는 표시됩니다.

var context = global context”;

function SomeOtherMethod(){
alert(this.context);
}

function SomeMethod(){
this.context = local context”;
SomeOtherMethod();
}

var instance = new SomeMethod();

그러나 화살표 기능을 사용하여 통화를 교체하면 "로컬 컨텍스트"가 표시됩니다.

var context = "global context";

    function SomeMethod(){
        this.context = "local context";
        SomeOtherMethod = () => {
            alert(this.context);
        }
        SomeOtherMethod();
    }
    var instance = new SomeMethod();

자바 스크립트 컨텍스트의 모든 시나리오를 설명하고 호출자 컨텍스트가 존중되지 않는 시나리오를 설명하는 이 링크 ( JavaScript의 화살표 기능) 를 읽으십시오 .

이 유튜브 비디오에서 컨텍스트라는 용어를 실제로 보여주는 화살표로 자바 스크립트로 화살표 기능을 시연 할 수도 있습니다 .


0

다른 사람들이 말했듯이, 일반 (전통적인) 기능 this은 기능을 호출 한 객체 (예 : 클릭 한 버튼)에서 사용 합니다. 대신, 화살표 함수 this는 함수를 정의하는 객체에서 사용 합니다.

거의 동일한 두 가지 기능을 고려하십시오.

regular = function() {
  ' Identical Part Here;
}


arrow = () => {
  ' Identical Part Here;
}

아래 스 니펫 this은 각 기능에 대해 나타내는 것과의 근본적인 차이점을 보여줍니다 . 정규 함수 출력 [object HTMLButtonElement]반면 화살표 함수 출력한다[object Window].

<html>
 <button id="btn1">Regular: `this` comes from "this button"</button>
 <br><br>
 <button id="btn2">Arrow: `this` comes from object that defines the function</button>
 <p id="res"/>

 <script>
  regular = function() {
    document.getElementById("res").innerHTML = this;
  }

  arrow = () => {
    document.getElementById("res").innerHTML = this;
  }

  document.getElementById("btn1").addEventListener("click", regular);
  document.getElementById("btn2").addEventListener("click", arrow);
 </script>
</html>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.