developer tip

화살표 기능을 바인딩 할 수 있습니까?

copycodes 2020. 8. 16. 21:01
반응형

화살표 기능을 바인딩 할 수 있습니까?


나는 지금 ES6를 실험 해왔고 약간의 문제가 생겼습니다.

저는 화살표 기능 사용을 정말 좋아하고 가능할 때마다 사용합니다.

그러나 바인딩 할 수없는 것처럼 보입니다!

기능은 다음과 같습니다.

var f = () => console.log(this);

다음은 함수를 바인딩하려는 개체입니다.

var o = {'a': 42};

그리고 여기에 바인딩하는 방법 f이 있습니다 o.

var fBound = f.bind(o);

그런 다음 전화 할 수 있습니다 fBound.

fBound();

다음을 출력합니다 ( o객체).

{'a': 42}

멋있는! 아름다운! 작동하지 않는 것을 제외하고. o객체 를 출력하는 대신 객체를 출력 window합니다.

그래서 저는 알고 싶습니다 : 화살표 함수를 바인딩 할 수 있습니까? (그렇다면 어떻게?)


위의 코드를 Google Chrome 48 및 Firefox 43에서 테스트했는데 결과는 동일합니다.


화살표 기능을 "리 바인드"할 수 없습니다. 항상 정의 된 컨텍스트로 호출됩니다. 정상적인 기능을 사용하십시오.

로부터 ECMAScript를 2,015 사양 :

ArrowFunction 내의 인수, super, this 또는 new.target에 대한 모든 참조는 어휘로 둘러싸인 환경의 바인딩으로 확인되어야합니다. 일반적으로 이것은 즉시 둘러싸는 함수의 함수 환경입니다.


완료하려면 다시 바인딩 기능을 화살표, 당신은 단지의 의미를 변경할 수 없습니다 this.

bind 여전히 함수 인수에 대한 값이 있습니다.

((a, b, c) => {
  console.info(a, b, c) // 1, 2, 3
}).bind(undefined, 1, 2, 3)()

여기에서 시도해보세요 : http://jsbin.com/motihanopi/edit?js,console


로부터 MDN :

화살표 함수 표현식은 함수 표현식에 비해 구문이 짧고 this 값을 어휘 적으로 바인딩합니다 (자체 this, arguments, super 또는 new.target을 바인딩하지 않음). 화살표 함수는 항상 익명입니다.

이는 원하는대로 값을 바인딩 할 수 없음을 의미합니다.


수년 동안 js 개발자는 컨텍스트 바인딩으로 어려움을 겪었고, 왜 this자바 스크립트에서 변경 되었는지 물었고 , 컨텍스트 바인딩과 this자바 스크립트와 this대부분의 다른 OOP 언어 에서 의 의미 차이로 인해 수년에 걸쳐 많은 혼란을 겪었습니다 .

이 모든 것이 나를 왜, 왜, 왜 묻는다! 왜 화살표 기능을 리 바인딩하지 않겠습니까! 이 모든 문제와 혼란을 해결 하고 기능의 범위를 보존 하기 위해 사용 bind하거나 call다른 방법을 사용하지 않도록 특별히 만든 것입니다.

TL; DR

아니요, 화살표 기능을 다시 바인딩 할 수 없습니다.


ES6 Arrow 함수가 JavaScript에서 "이"를 진정으로 해결합니까?

위의 링크는 화살표 기능 thisbind, call, apply기능에 따라 변경되지 않는다는 것을 설명합니다 .

아주 좋은 예를 들어 설명합니다.

이것을 실행 node v4하여 "예상 된"동작을 확인합니다.

this.test = "attached to the module";
var foo = { test: "attached to an object" };
foo.method = function(name, cb){ 
    // bind the value of "this" on the method 
    // to try and force it to be what you want 
    this[name] = cb.bind(this); };
foo.method("bar", () => { console.log(this.test); });
foo.bar(); 

var obj = {value: 10};
function arrowBind(fn, context) {
  let arrowFn;
  (function() {
    arrowFn = eval(fn.toString());
    arrowFn();
  }).call(context);
}
arrowBind(() => {console.log(this)}, obj);


며칠 전에 같은 질문을했습니다.

this가 이미 바인딩 되었으므로 값을 바인딩 할 수 없습니다 .

ES6 => 함수 연산자에 다른이 범위 바인딩


이 예가 도움이 될 수 있습니다.

let bob = {
   _name: "Bob",
   _friends: ["stackoverflow"],
   printFriends:(x)=> {
      x._friends.forEach((f)=> {
         console.log(x._name + " knows " + f);
      });
   }
}

bob.printFriends = (bob.printFriends).bind(null,bob);
bob.printFriends();

참고 URL : https://stackoverflow.com/questions/33308121/can-you-bind-arrow-functions

반응형