>  기사  >  웹 프론트엔드  >  JavaScript 문에서 다음 세미콜론 관련 문제

JavaScript 문에서 다음 세미콜론 관련 문제

亚连
亚连원래의
2018-06-21 18:56:051806검색

다음은 이 글을 통해 자바스크립트 구문 뒤에 숨어 있는 세미콜론 문제에 대해 자세히 소개한 내용입니다. 필요하신 분들은 참고하시면 됩니다.

세미콜론 자동 추가에는 3가지 규칙이 있습니다. JavaScript

  1. 개행 문자(개행 문자가 포함된 여러 줄 주석 포함)가 있고 다음 토큰이 이전 구문과 일치할 수 없는 경우 세미콜론이 자동으로 추가됩니다.

  2. }이 있을 때 세미콜론이 빠졌으면 채워집니다.

  3. 프로그램 소스 코드가 끝날 때 세미콜론이 빠졌으면 채워집니다.

자체 JS 구문 분석 도구인 JSinJS(https://github.com/kissjs/JSinJS)를 사용하여 첫 번째 문장(즉, 첫 번째 문장 집합)에 나타날 수 있는 JS 구문 태그를 모두 찾았습니다. , 총

["debugger", "try", "throw", "switch", "Identifier", "with", "return", "break", "continue", "for", "while", "do", "if", "new", "function", "(", "{", "[", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "this", "!", "~", "-", "+", "--", "++", "typeof", "void", "delete", ";", "var"]

35개입니다.

세미콜론 이전에 나타날 수 있는 문법 기호(즉, 세미콜론을 제거한 후 마지막 집합)도 모두 찾았는데, 총

["--", "++", "IdentifierName", "]", ")", "}", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "Identifier", "this", "debugger", "return", "break", "continue"]

17개입니다.

35*17 = 595개의 조합. 기억을 돕기 위해 아래에서 문법적 모호성을 그룹별로 논의하겠습니다. (원래 엑셀로 표를 만들었으나 표가 너무 커서 게시할 수 없습니다.)

우선, 다음 구문 표시로 시작하는 명령문은 절대적으로 안전하며 세미콜론 없이 이전 줄과 어떤 모호함도 일으키지 않습니다:

var if do while for continue break return with switch throw try debugger ;

다음으로 세미콜론을 추가하지 않음으로 인해 발생하는 문법적 모호성을 그룹화해 보겠습니다.

  1. 첫 번째는 두 연산자 ++ 및 --가 이전 줄 끝에 나타나고 다음 줄이 시작되는 경우입니다. 다음과 같은 경우 문법적 모호성이 발생합니다.

  2. function delete void typeof new null true false NumericLiteral StringLiteral RegularExpressionLiteral ( [ { Identifier ++ -- + - ~ !

  3. 그중 function과 delete는 매우 일반적입니다.

  4. 특히 ++ 및 --가 한 줄로 구분되는 경우 JS의 문법 규칙에 따르면 후행 증가 연산은 중간에 개행 삽입을 허용하지 않으므로 ++ -- 는 사전 증가로 간주되어 다음 줄이 함께 연결됩니다.

  5. 두 번째 경우는 반환이 이전 줄로 끝나는 경우입니다.

  6. 함수 삭제 void typeof ( [ { Identifier ++ -- + - ~ !

  7. 또한 JS 문법 규칙에서는 return과 다음 값 사이에 줄바꿈 삽입을 허용하지 않기 때문에 return 뒤에 줄바꿈 문자가 있는 한, 세미콜론으로 간주되어 사용자의 기대와 충돌하는 경우가 많습니다.

  8. 세 번째 경우는 다음 줄이 +와 -로 시작하고 이전 줄이 다음으로 끝나는 경우입니다. 문법적 모호성:

  9. -- ++ IdentifierName ] ) } RegularExpressionLiteral

  10. + 또는 -로 시작하는 문이 거의 없기 때문에 이 상황은 위험한 것으로 간주되지 않습니다. 네 번째 상황은 이전 줄이 break 또는로 끝나는 경우입니다. 계속하면 다음 줄이 식별자로 시작하면 문법적 모호성이 발생합니다.

  11. 다섯 번째 유형은 다음 줄이 ( 및 [로 시작하고 이전 줄이 다음으로 끝나면 문법적 모호성이 발생합니다.

  12. -- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral 식별자 this

  13. 이 상황은 매우 위험합니다(그래서 Hax의 기사에서는 이 상황 앞에 세미콜론이 와야 한다고 언급했습니다).

  14. 여섯 번째는 다음 줄이 RegularExpressionLiteral로 시작될 때 이전 줄의 다음 끝이 나누기 기호로 인식되도록 하는 것입니다.

  15. -- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral 식별자 this

  16. Summary ,

return, break, continue, post-increment 및 post-decrement의 5개 문에서 개행 문자는 다음을 수행할 수 있습니다. 완전히 세미콜론을 바꾸십시오.

  1. var if do while for continue break return with 스위치 던지기 여러 키워드로 시작하는 디버거 문과 빈 문을 시도해 보세요. 이전 줄에 세미콜론을 추가하거나 추가하지 않으면 거의 효과가 없습니다.

  2. 표현식문, 함수식문 뒤에 세미콜론을 추가하지 않는 것은 매우 위험하고 상황도 매우 복잡합니다.

  3. ( 및 [ 앞에 세미콜론이 없는 문은 매우 위험합니다.

  4. 다음은 예제 코드를 통해 JavaScript의 세미콜론 문제를 소개합니다.

일반적으로 게으른 앞 -end 프로그램 회원들은 설명할 수 없는 문제에 자주 직면합니다. 오늘은 JS에서 자주 발생하는 세미콜론에 대한 몇 가지 문제에 대해서만 논의하겠습니다. JavaScript가 세미콜론을 생략할 수 있는 이유는 세미콜론이 없으면 줄 바꿈을 대체하기 때문입니다. 그러나 일부 특정 경우에는 기본적으로 추가되지 않습니다. 이제 이 경우 주의해야 할 몇 가지 사항을 간략하게 소개하겠습니다.

var x = 0
[x+1,x+2,x+3].forEach(function(){
console.log(x)
})

这种情况下会导致程序无法正常运行。JavaScript在解析这段代码是并不会在var x = 0后换行。
在写代码时如果以一条语句以 ”(”  ,"[" ,"+" ,"-"  ,"/"  开始时通常在上一条语句不会默认添加分号的。所以在这种情况下尽量保持一下这种写法,在以这些字符开始时在行首添加一个分号,这样可以保证在别人更改上面代码时不加分号也不会影响以下代码运行。

var x = 0
;[x+1,x+2,x+3].forEach(function(){
console.log(x)
})

还有就是在涉及 return   break   continue  这种语句时尽量不要换行

return 
true;
JavaScript会解析为
return; true;
在涉及  ++  和  --  这一系列运算时 在作为表达式的前缀或后缀时在换行是会有一定的问题,如下情况:
var x = 0;
var y = 0;
x
++
y

JavaScript会解析为

x;++y;      而不是    x++;y;

虽然在JavaScript这门语言中  “;”  是可以省略不写的,但是还是建议大家每句代码后都跟上  “;”  养成这种良好的编码习惯,毕竟在大多语言中不带  “;”  的编码适不适用的。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在JavaScript中如何判断变量名是否存在数组中

通过JS如何实现延迟隐藏功能

使用Angular如何实现定时器功能

使用Angular如何实现三角箭头标注功能

위 내용은 JavaScript 문에서 다음 세미콜론 관련 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.