화살표 함수는 JavaScript 파서를 끊습니다.

8388 단어 javascript
이것은 매우 심오한 댓글이다!즐겨라.🔨🤓
C 언어로 자바스크립트 해상도를 작성하는 과정에서, 이것은 다른 날의 게시물이지만, 당신은 한번 시도해 보십시오. via Web Assembly online here 자바스크립트의 유일한 진정한 모호성을 발견했습니다.
서프라이즈!이것은 arrow 함수입니다. 당신이 가장 좋아하는 쓰기 방법과 리셋의 속기입니다.어떻게 보이는지 빠르게 알려 줍니다.
const method = (arg1, arg2) => {
  console.info('do something', arg1, arg2);
};
const asyncMethodAddNumber = async foo => (await foo) + 123;

왜?➡️ 완전히
Arrow 함수는 해당 역할 영역을 선언하는 변수this를 적용합니다.다음은 일반적인 예입니다.
class Foo {
  constructor(things) {
    this.total = 0;
    things.forEach((thing) => this.total += thing);
  }
}
위의 내용을 사용function (thing) { ... }으로 변경하면 액세스this.total가 실패합니다. this 설정이 올바르지 않습니다.일반적으로 나의 건의는 기본적으로 쓰는 것이다. () => ...나는 그것이 있다고 믿는다. least surprise
(이하 JS의 합리적 위약은 약 let,constvar!)

모호성
그래서: 해상도를 작성할 때, 모든 태그가 무엇인지, 어떤 문장이나 표현식이 구성되었는지 확인하는 것이 목표입니다.JavaScript의 문법은 이것을 상당히 간단하게 합니다. 대부분의 경우 'forward' 를 가장 많이 볼 필요가 있습니다.

손 놓다
다음은 사용let의 예입니다.당신은 알고 있습니까? let 때로는 하나의 키워드(새로운 변수를 정의하는 데 사용), 때로는 유효한 변수 이름 자체입니다^
let += 123;  // let is a symbol which I'm adding 123 to
let abc;     // I'm declaring a variable "abc"
(dev.to의 문법인 하이라이트가 여기에서 틀렸다는 것을 주의하세요!🤣)
그래서 let는 키워드입니다. 만약에:
  • 최대 실행 수준(괄호 안에 없음)
  • ... "for"성명에 없으면, 예를 들면: for (let ...
  • 다음 표기는 문자(또는 [{, 표시let {x,y} = ...
  • 다음 영패는 in 또는 instanceof
  • ... let in foo에서 물어본 바와 같이'let'에 포함된 변수는 대상'foo'
  • 의 키입니까

    하드:화살표 기능
    하지만 이 글은 겸손의 화살의 기능에 관한 것이다!현재 화살표 함수의 시작은 두 가지 다른 형식이 있을 수 있다.첫 번째는 화살표 함수로 확인할 수 있습니다.
    foo => bar;
    async foo => something + await blah;
    
    해석기가 foo (또는 그 어떠한 명명 변수) 를 만났을 때, 다음 표시를 보고 화살표인지 물어볼 수 있습니다. =>우리는 async부터 앞을 볼 수 있다. async variableName의 유일한 유효한 해석은 비동기 화살표 함수의 시작이기 때문이다.만세!🎊
    그러나 괄호의 경우, 예를 들어(foo, bar) 우리의 해석기는 무엇을 해야 할지 모른다.이것은 정확한 계산 순서를 확보하기 위해 괄호에 수학을 넣는 것을 고려하는 표현식 목록일 수도 있다.
    화살표 함수의 접두사async가 더욱 모호하다. 왜냐하면 async는 기술적으로 방법 호출의 명칭이기 때문이다.예, 그렇습니다. 다음 JavaScript가 유효합니다.🤮
    var y = 123;
    var async = (x) => x * 2;  // assign 'async' to a function
    console.info(async(y));    // call 'async' as a function!
    
    나는 네가 그것을 복사해서 컨트롤러에 붙이기를 기다릴 것이다.📥
    (마찬가지로 문법이 밝아서 오류가 발생하고 async가 키워드임을 나타냅니다!😂)

    솔루션
    몇 가지 해결 방안이 있다.어쨌든 우리는 앞을 보고 그 희미한 점을 넘어야 한다.중요한 것은 이것이'빨리'가 아닐 수도 있다는 것을 명심하는 것이다.
    다음은 인위적인 예이다.
    (arg=function() {
      // whole other program could exist here
    }) => ...
    
    만약 우리가 첫 번째 함수 ( 가 화살표 함수를 열었는지 알고 싶다면, 우리는 다음 함수 => 를 찾기 위해 앞으로 해석할 수 있다.천진스럽게도 우리는 이 모든 일을 포기하고 다시 (부터 해석할 것이다.
    그러나 만약 우리의 목표가 속도라면 우리는 모든 일을 버릴 것이다.
    반대로 더 좋은 해결 방안은 일부러 그것을 애매모호하게 하고 잠시 후에 다시 토론하는 것이다.우리가 괄호 안의 내용을 해석하는 방식--다행히도!--화살표 함수인지 여부는 변경되지 않습니다.같은 기호, 등호 등은 모두 그곳에서 사용할 수 있다.
    따라서 우리는 일련의 이런 기호화폐를 얻을 수 있다.
    AMBIG_PAREN
    PAREN       (
    SYMBOL      que
    OP          =
    FUNC        function
    ...
    CLOSE       )
    ARROW       =>
    
    이제 우리는 AMBIG PAREN을 분명히 할 수 있습니다. 이것은 arrow 함수 성명을 시작합니다.이것도 프로그램의 모든'깊이'에서 한 번만 발생할 수 있다. 같은 잘못된 의미는 다른 프로그램 전체에서 발생할 수 있지만 더욱 높은 깊이에서 발생할 수 있다.

    일부 배경
    ^
    공평하게 말하면, 엄격한 모드에서 실행할 때, 자바스크립트의 일부 모호성이 해결되었다.
    예를 들어 이런 모델에서 우리는 let를 변수명으로 사용할 수 없다.그러나 모든 코드가 이런 식으로 작성되거나 제공된 것은 아니며 엄격한 패턴async이나 화살표 함수의 행위는 바뀌지 않는다.

    일반 슬래시
    JavaScript 해석기는 또 하나의 흥미로운 도전을 가지고 있다. 빗장이 나눗셈이냐, 정규 표현식의 시작이냐.예를 들면 다음과 같습니다.
    function foo() {} / 123 /g
    
    물음: 위의 코드는 아무런 의미가 없지만, 우리는'123으로 나누기, g로 나누기'가 왜 해석되었는지 물어야 한다.
    답: 원래 이것은 정규 표현식이었다.이것은 최고급 함수가 표현식이 아니라 성명이기 때문이다.만약 우리가 ()로 전체 선을 포위한다면 그것은 분열이다.
    그러나 화살표 함수와 달리 JavaScript 파서에서는 이것이 진정한 문제가 아닙니다.우리가 코드를 왼쪽에서 오른쪽으로 훑어볼 때, 우리는 곧 나타날 빗장을 추적하기만 하면 된다.그래서 이게 틀림없어.🤷

    지느러미
    내가 너에게 이것은 심오하다고 말했지!여기까지 읽어줘서 고마워요.개인적으로 JavaScript가 발전하는 과정에서 모호성에서 벗어나는 것을 보고 싶지만, 그 광범위한 사용은 문법에서 약간 짜증나는 특성을 복원하는 데 방해가 될 것이라고 생각한다.😄
    셋👋

    좋은 웹페이지 즐겨찾기