화살표 기능을 바인딩 할 수 있습니까?
나는 지금 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에서 "이"를 진정으로 해결합니까?
위의 링크는 화살표 기능 this
이 bind, 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
가 이미 바인딩 되었으므로 값을 바인딩 할 수 없습니다 .
이 예가 도움이 될 수 있습니다.
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
'developer tip' 카테고리의 다른 글
SSH를 로그 아웃 한 후에도 백그라운드에서 Python 스크립트를 실행하는 방법은 무엇입니까? (0) | 2020.08.17 |
---|---|
히스토그램 Matplotlib (0) | 2020.08.17 |
Ruby 1.8과 Ruby 1.9의 차이점은 무엇입니까? (0) | 2020.08.16 |
SQL Server의 문자열에서 HTML 태그를 제거하는 가장 좋은 방법은 무엇입니까? (0) | 2020.08.16 |
SQL Server의 문자열에서 HTML 태그를 제거하는 가장 좋은 방법은 무엇입니까? (0) | 2020.08.16 |