JavaScript의 자동 세미콜론 삽입(ASI) 규칙은 무엇입니까?
글쎄요, 우선 브라우저에 의존하는지 물어봐야 할 것 같습니다.
잘못된 토큰이 발견되었지만 해당 토큰이 비활성화될 때까지 코드 섹션이 유효한 경우 줄 바꿈 앞에 세미콜론이 삽입된다고 읽었습니다.
단, 세미콜론 삽입으로 인해 발생하는 버그에 대해 일반적으로 인용되는 예는 다음과 같습니다.
return
_a+b;
..a가 유효한 토큰이기 때문에 이 규칙을 따르지 않는 것 같습니다.
한편, 콜 체인을 절단하는 것은 예상대로 동작합니다.
$('#myButton')
.click(function(){alert("Hello!")});
규칙에 대해 좀 더 자세히 설명해 주실 분?
먼저 자동 세미콜론 삽입(간단함을 위해 ASI라고도 함)의 영향을 받는 문장이 무엇인지 알아야 합니다.
- 공허한 문장
var의 표시- 표현문
do-while의 표시continue의 표시break의 표시return의 표시throw의 표시
ASI의 구체적인 규칙은 § 11.9.1 자동 세미콜론 삽입 규칙 (Rules of Automatic Demicolon Insertion)에 기술되어 있다.
다음의 3가지 경우에 대해 설명합니다.
- 문법에 의해 허용되지 않는 위반 토큰이 발견되면 다음과 같은 경우 해당 토큰 앞에 세미콜론이 삽입됩니다.
- 토큰은 되어 있습니다.
LineTerminator. - 은 「」입니다.
}
예:
{ 1
2 } 3
로 변환됩니다.
{ 1
;2 ;} 3;
NumericLiteral 1첫 번째 조건을 충족합니다.하다2두 합니다.음음음음음}.
- 토큰 입력 스트림의 끝이 발견되어 파서가 입력 토큰 스트림을 하나의 완전한 프로그램으로 해석할 수 없는 경우 입력 스트림의 끝에 세미콜론이 자동으로 삽입됩니다.
예:
a = b
++c
다음과 같이 변환됩니다.
a = b;
++c;
- 이 경우는 문법의 일부 생산에서 토큰이 허용되지만 생산이 제한된 생산일 경우 세미콜론이 제한된 토큰 앞에 자동으로 삽입됩니다.
제한된 프로덕션:
UpdateExpression :
LeftHandSideExpression [no LineTerminator here] ++
LeftHandSideExpression [no LineTerminator here] --
ContinueStatement :
continue ;
continue [no LineTerminator here] LabelIdentifier ;
BreakStatement :
break ;
break [no LineTerminator here] LabelIdentifier ;
ReturnStatement :
return ;
return [no LineTerminator here] Expression ;
ThrowStatement :
throw [no LineTerminator here] Expression ;
ArrowFunction :
ArrowParameters [no LineTerminator here] => ConciseBody
YieldExpression :
yield [no LineTerminator here] * AssignmentExpression
yield [no LineTerminator here] AssignmentExpression
로서 「」를 하고 있습니다.ReturnStatement:
return
"something";
로 변환됩니다.
return;
"something";
스펙의 3가지 규칙을 잘 이해할 수 없었습니다.- 좀 더 알기 쉬운 영어를 원합니다.- 하지만 자바스크립트에서 얻은 것은 다음과 같습니다.The Depositive Guide, 제6판, David Flanagan, O'Reilly, 2011년:
견적:
자바스크립트는 세미콜론을 세미콜론으로 취급하지 않습니다. 일반적으로 세미콜론 없이 코드를 구문 분석할 수 없습니다.
다른 인용: 코드에는 다음과 같습니다.
var a
a
=
3 console.log(a)
자바스크립트는 = 3을 계속 구문 분석할 수 있기 때문에 두 번째 라인을 세미콜론으로 취급하지 않습니다.
그리고 다음을 가리킨다.
자바스크립트 통역선이 첫 번째 라인에서 두 번째 선을 구문 분석할 수 없는 일반적인 규칙에서 세미콜론을 구문 분석할 수 없는 일반적인 규칙으로 분할을 구분할 수 없는 일반적인 규칙으로 분할된다.첫 예외는 반환, 휴식, 중단, 계속 상태를 유지합니다.
... 이 단어 중 어느 쪽이 있으면...자바스크립트는 항상 세미콜론을 세미콜론으로 해석할 것이다.
... 두 번째 예외는 ++ 연산자와 -- 연산자를 포함합니다.이러한 연산자 중 하나를 사후 수정 연산자로 사용하려면 해당 연산자가 적용되는 식과 동일한 행에 표시되어야 합니다.그렇지 않으면 줄 바꿈은 세미콜론으로 처리되며 ++ 또는 --는 다음 코드에 적용되는 접두사 연산자로 해석됩니다.예를 들어 다음과 같은 코드를 생각해 보겠습니다.
x
++
y
'아주 좋다'라고 .
x; ++y;는 할 수 없습니다.x++; y
그래서 심플화하면 다음과 같은 것을 의미합니다.
한단, 두 경우: (1)은 "JavaScript"와 같은 뒤에 .return,break,continue(2)가 되어 있는 및 (2)를 참조해 주세요++ ★★★★★★★★★★★★★★★★★」--에 「이행」, 「이행」, 「이행」, 「이행」이 됩니다.;이전 행의 끝에 있습니다.
'이치에 맞는 한 코드의 계속으로 취급한다'는 부분은 정규 표현의 욕심맞는 듯한 느낌을 준다.
말한 바와 같이, 은 술술와바 for, for것 for for for for for for for를 합니다.return으로 JavaScript 는 JavaScript 를 삽입합니다.;
(따옴표: 줄 이 다음중 등)return줄 JavaScript 。
그리고 이러한 이유로, 그 전형적인 예는
return
{
foo: 1
}
JavaScript 인터프리터에서는 다음과 같이 처리되기 때문에 예상대로 동작하지 않습니다.
return; // returning nothing
{
foo: 1
}
그 immedi the the the the the the the the the the 뒤에 줄 .return:
return {
foo: 1
}
제대로 작동하도록 해야 합니다. 이렇게 해서 이렇게 삽입을 .;만약 당신이 사용 규칙을 따른다면, 당신 자신이;하다
return {
foo: 1
};
ECMA-262 제5판 ECMAScript 사양에서 직결:
7.9.1 세미콜론 자동 삽입 규칙
세미콜론 삽입에는 다음 3가지 기본 규칙이 있습니다.
- 프로그램이 왼쪽에서 오른쪽으로 해석될 때 문법적으로 허용되지 않는 토큰(해당 토큰이라고 함)이 발견되면 다음 조건 중 하나 이상이 충족되면 세미콜론이 자동으로 문제 토큰 앞에 삽입됩니다.
- 의 토큰으로 .
LineTerminator.- 문제의 토큰은 입니다.
- 을 단일 할 수 .
Program그러면 입력 스트림 끝에 세미콜론이 자동으로 삽입됩니다.- 프로그램이 왼쪽에서 구문 분석되면, 일부 제품의 일부 생산에 의해 허용되지만, 해당 품목에 제한되지 않은 제품이나 토큰은 1:1로 제한된다.그러한 토큰은 불린다.제한 토큰) 및 제한 토큰을 적어도1개의 LineTerminator에 의해 이전 토큰에서 분리한 후 세미콜론이 제한 토큰 앞에 자동으로 삽입됩니다.
단, 위의 규칙에는 다른 덮어쓰기 조건이 있습니다.즉, 세미콜론이 빈 스테이트먼트로 해석되거나 그 세미콜론이 스테이트먼트의 헤더에 있는2개의 세미콜론 중 하나가 되는 경우 세미콜론은 자동으로 삽입되지 않습니다(12.6.3 참조).
세미콜론 삽입 및 var 문에 대해서는 var를 사용하지만 여러 행에 걸쳐 있는 경우 쉼표를 잊지 않도록 주의하십시오.어제 누군가 내 코드에서 이걸 발견했어
var srcRecords = src.records
srcIds = [];
실행되었지만 결과는 srcIds 선언/할당이 글로벌하다는 것입니다.이는 자동 세미콜론 삽입으로 인해 이전 행에 var가 있는 로컬 선언이 종료된 것으로 간주되었기 때문입니다.
내가 찾은 JavaScript의 자동 세미콜론 삽입에 대한 가장 문맥적인 설명은 Crafting Interpreter에 관한 책에서 나온 것이다.
JavaScript의 "자동 세미콜론 삽입" 규칙은 홀수입니다.다른 언어에서 대부분의 새로운 행이 의미가 있다고 가정하고 여러 행 문에서 일부만 무시해야 하는 경우 JS는 그 반대라고 가정합니다.해석 오류가 발생하지 않는 한 모든 새 행은 의미 없는 공백으로 취급됩니다.이 경우 이전 줄바꿈을 세미콜론으로 변환하여 문법적으로 유효한 것을 얻으려고 합니다.
그는 계속해서 당신이 냄새를 코드화 하는 것처럼 묘사했다.
이 디자인 노트는 디자인 비판의 대상이 될 수 있습니다.그것마저도 어떻게 동작하는지에 대해서 자세히 설명하면, 하물며 나쁜 생각인 것은 말할 것도 없습니다.엉망진창이다.JavaScript는 많은 스타일 가이드가 이론적으로 세미콜론을 회피할 수 있도록 하고 있음에도 불구하고 모든 문 뒤에 명시적인 세미콜론을 요구하는 유일한 언어입니다.
덧붙이자면
const foo = function(){ return "foo" } //this doesn't add a semicolon here.
(function (){
console.log("aa");
})()
참조, 즉시 호출된 함수 표현(IIFE) 사용
언급URL : https://stackoverflow.com/questions/2846283/what-are-the-rules-for-javascripts-automatic-semicolon-insertion-asi
'programing' 카테고리의 다른 글
| phpmyadmin은 사용자를 삭제할 수 없습니다. (0) | 2023.01.27 |
|---|---|
| MacOS나 BOOT에서 MariaDB(MySQL 등)를 시작하려면 어떻게 해야 합니까? (0) | 2023.01.27 |
| Python에서는 "camel case" 또는 밑줄을 사용해야 합니까? (0) | 2023.01.27 |
| Google reCaptcha 응답 "미포착(약속) null" (0) | 2023.01.27 |
| _references.js의 용도는 무엇입니까? (0) | 2023.01.27 |