JavaScript 코드가 "바인딩 자르기"를 원하는 이유는 무엇입니까?


10

사용하는 이유

(0, foo.fn)();

하는 것입니다 바인딩을 잘라 다음은 this결합되지 더 이상 것입니다 foo하지만 전역 객체에 바인딩됩니다.

그러나 JavaScript 코드 (또는 Google JS 코드)가 바인딩을 자르고 싶은 이유는 무엇입니까? (반 패턴인지 아닌지)


그것을 바인딩 이라고 부르는 것은 옳지 않다. bind메소드가 바인드됩니다. 여기 상황이 바뀌 었습니다. 바인딩 (에서 만든 본드)을 자르거나 잃을 수 없습니다 bind.
marzelin '12

아마도이 코드는 함수 호출과 관련하여 특정 요구 사항이있는 일부 기능 언어 (clojurescript?)의 변환기로 생성됩니까?
marzelin '12

의 중복 가능성 왜 바벨의 재 작성에 함수 호출 (0, FN)를 수입 않습니다 (...)? -또는 다른 곳이 있습니까?
Bergi

내가 구글의 코드에서 가능성이 각도 같은 몇 가지 프레임 워크를 본 것 같아요 반작용, 또는 다른 사람은 ... 어디에 기억 때로는이 축소 된입니다 수 없습니다
nonopolarity

답변:


8

이러한 종류의 코드는 일반적으로 바벨과 같은 변환기에 의해 생성되어 최신 사양을 추가 한 최신 JavaScript를보다 널리 지원되는 JavaScript 버전으로 변환합니다.

이 트랜스 필 레이션 패턴이 발생하는 예는 다음과 같습니다.

코드 변환 전에이 원본 코드가 있다고 가정 해 보겠습니다.

import {myfunc} from "mymodule";
myfunc();

이 ES5 호환 코드를 만들려면 다음을 수행하십시오.

"use strict";    
var mymodule = require("mymodule");    
mymodule.myfunc();

그러나 여기서 우리가 실행하는 것 myfuncmymodule같은 this원래의 코드에서 발생되지 않은 값. 그 힘은 항상 문제가되지 않지만, 확실히 기능 동작합니다을하는 것이 좋습니다 그냥 원래 버전에서와 같이 그 함수가 사용한다하더라도, this어떻게 이상한 또는 쓸모없는 것은 사용하는 것을 - 참조 this에가 myfunc(수도를 원래 버전에서도 undefined) 일 것 입니다.

예를 들어, 원래 코드가 this.memberFun()함수 의 참조로 인해 오류를 발생시키는 경우 변환 된 버전에서도 발생합니다.

따라서 쉼표 연산자를 사용하여 해당 차이점을 제거했습니다.

(0, mymodule.myfunc)();

사용하지 것처럼 수여, 코드에서 사용자가 직접 작성하는 것이, 당신은이 패턴에 대한 좋은 사용 사례가 결코 this에서 myfunc처음에.


어떻게 requireES6 또는 ES5 중 관련? 필자는 require가 노드 모듈이라고 생각했습니다.
connexo

require실제로 노드에서 사용할 수 있거나 browserify, require.js 등과 같은 라이브러리에서 제공되는 함수입니다. ES5 / 6과 특별히 관련이 없습니다. 반면에 ES6 + 언어 구조는 변환과 같은 import것이 없으면 ES5로 백 포트 될 수 없습니다.
trincot

따라서 요약의 여러 줄로 요약하면 : 실제로 메서드 또는 OO가 아닌 많은 함수를 포함하는 라이브러리 또는 모듈 인 경우 ()의 형태 modA.fn1로 이러한 함수는 실제로 사용해서는 this안되지만 실수로 우연히 발생하는 경우 그것들은 this부작용으로 모듈에 영향을 미치는 것을 원하지 않기 때문에 바인딩을 자르고 독립적 인 함수라면 어떻게 행동해야하는지
nonopolarity

그렇습니다, 그것은 당신이 그것을 요약 할 수있는 방법입니다. 다시 말하지만 이것은 대부분 코더가 아닌 트랜스 파일러의 관심사입니다.
trincot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.