>웹 프론트엔드 >JS 튜토리얼 >세미콜론이 있는 JavaScript 코드와 없는 JavaScript 코드의 차이점 소개

세미콜론이 있는 JavaScript 코드와 없는 JavaScript 코드의 차이점 소개

coldplay.xixi
coldplay.xixi앞으로
2020-12-25 17:33:485770검색

javascript이 칼럼에서는 세미콜론이 있는 코드와 없는 코드의 차이점을 소개합니다.

세미콜론이 있는 JavaScript 코드와 없는 JavaScript 코드의 차이점 소개

권장(무료): javascript(동영상)

이 문제는 많은 기사에서 논의되었습니다. ESlint 사양도 세미콜론 추가 여부에 따라 두 가지 진영으로 나뉩니다. 세미콜론 추가 여부에 관해서는 시작하기 전에 세미콜론이 JavaScript에 미치는 영향을 이해하는 것이 핵심입니다. 다음 인터뷰 질문:

이 코드가 정상적으로 실행될 수 있나요?

rreee

.

.

.

.

이 코드를 실행하면 다음 오류가 나타납니다.

var a = 1
(function() {
  console.log(2)
})()

What the hell! 1은 함수가 아닙니다? 우리는 숫자 1을 실행할 의도가 없었습니다. 숫자 1이 함수가 아닌 이유는 무엇입니까? 이런 종류의 오류는 찾기 어렵고 종종 문제가 있는 코드 줄 주위에서 발생합니다. 이 오류는 위 코드가 런타임 시 동일한 라인으로 간주되기 때문에 발생합니다. 개념은 다음과 같습니다. 1 is not a function ?我们没有打算运行数字 1,为什么说数字 1 不是函数,这种错误是很难找到原因的,经常会在出问题的代码行上打转。这个错误必然是上吗的代码在运行时被看作是同一行,其概念如下:

Uncaught TypeError: 1 is not a function

因此立即函数的 () 被附加在 1 上,这是一个调用函数的语法,所以会产生 1 is not a function 的错误,想要避免这个错误就需要使用分号:

var a = 1(function() { /* */ })()

ASI 自动加入分号

ASI是 “Automatic Semicolon Insertion” 的缩写,在运行时会往有些折行的代码中自动插入分号,这个机制可以使部分代码在没有加入分号时也能正常运行,比如下面的例子:

var a = 1 // 随便把分号放在哪里,只要能隔开就行
;(function() {
  console.log(2)
})()

由于代码中的 ++ 属于一元表达式,它只能在表达式的左边右边放置变量,如果没有 ASI 的机制,代码会被转换为 var b = 1 ++ b 这样的错误语句。不过好在有 ASI,在实际运行时会自动被加入分号,也就不会出现上面的错误。

var b = 1
++b
console.log('b', b)

return 与分号的关系

再来看一个例子,下面的代码在 return 的后面空一行后再写要返回的值,那么问运行结果是什么呢?

var b = 1;
++b;
console.log('b', b); // 2

这段程序代码因为 ASI 的修正,return 的后面会被加上一个分号,所以 return 与预期返回的值被分开了,结果 return 的内容为空值,最终的结果也只能是 undefined

function fn() {
  return 
  '小明'
}
console.log(fn())

到底应该怎样处理分号

本来 ASI 是出于一片好心,用来修正没有加入分号的代码片段,但偏偏在有的地方并没有发挥它的作用(例如本文一开始所介绍的立即函数),导致代码出现了错误;甚至有些代码不会出错,但会使你的代码执行结果和预期相差万里。

解决 ASI 问题的方式如下:

  • 无论如何都要加上分号,完全由自己决定代码的分割
  • 牢记不会自动加入分号的规则,当不会自动插入分号时,则手动加入

不会被自动加入分号的规则

下面时各种不会自动加入分号的规则:

  1. 新行的代码是从  ([/  字符开始的,这类情况一般会直接出现 Uncaught TypeError 从而导致代码无法运行。
function fn() {
  return;
  '小明';
}
console.log(fn()); // undefined
  1. 新行以 +-* 开始,这类情况大多会影响运算结果,所以应该合并为一行。
var a = 1
var b = a
(a + b).toString()

var a = 1
[1,2,3].forEach(bar)
 
(function() { })()
(function() { })()
 
var a = 1
var b = a
/test/.test(b)
  1. 新行以 ,. 开始,这种用法经常会出现,主要是为了避免代码过长而加入的分隔,这种情况并不会影响运行,如果善用的话会使代码更容易阅读。
var a = 2
var b = a
+a

如果遇到需要加入分号的情况,除了可以在语句的末尾加入分号外,也可以把分号加在“不会自动加入分号”的最前方,例如 () 本身不会自动加入分号,在有这种需求时可以将 ;

var a = 2
var b = a
  .toString()
console.log(typeof b)
 
var a = 1
,b = 2 // b 同样会被 var 声明
그래서 즉시 함수의 ()가 1에 추가됩니다. 함수 구문을 호출하면 1은 함수가 아닙니다 오류가 발생합니다. 이 오류를 피하려면 세미콜론을 사용해야 합니다.

// 运行错误
(function() { })()
(function() { })()
 
// 正确
;(function() { })()
;(function() { })()
ASI는 자동으로 세미콜론

ASI를 추가합니다. "자동 세미콜론 삽입"

의 약어는 런타임 중에 일부 끊어진 코드 줄에 세미콜론

을 자동으로 삽입합니다. 이 메커니즘을 사용하면 다음 예와 같이 일부 코드가 세미콜론을 추가하지 않고 정상적으로 실행될 수 있습니다. >++는 단항 표현식입니다. 변수는 왼쪽 🎜 또는 오른쪽에만 배치할 수 있습니다. ASI 메커니즘이 없으면 코드는 var b = 1 + + b 이러한 오류 설명입니다. 하지만 다행히 ASI를 사용하면 실제 연산 중에 세미콜론이 자동으로 추가되므로 위와 같은 오류는 발생하지 않습니다. 🎜rrreee🎜🎜return과 세미콜론의 관계🎜🎜🎜다음 코드에서 return 뒤에 빈 줄 뒤에 반환할 값을 적습니다. 수술? 🎜rrreee🎜이 프로그램 코드의 ASI 수정으로 인해 return 뒤에 세미콜론이 추가되므로 return이 예상 반환 값과 분리되어 결과는 return의 내용은 null 값이며 최종 결과는 정의되지 않음만 가능합니다. 🎜rrreee🎜🎜세미콜론을 어떻게 처리해야 할까요🎜🎜🎜원래 ASI는 좋은 의도에서 세미콜론이 포함되지 않은 코드 조각을 수정하는 데 사용되었지만 일부에서는 제 역할을 하지 못했습니다. 이 기사의 시작 부분에) 즉시 기능이 도입됨), 코드에 오류가 발생합니다. 일부 코드에서도 오류가 발생하지 않지만 코드의 실행 결과는 예상과 수천 마일 떨어져 있습니다. 🎜🎜ASI 문제를 해결하는 방법은 다음과 같습니다. 🎜
  • 무슨 일이 있어도 세미콜론을 추가하세요. 코드를 분할하는 방법을 결정하는 것은 전적으로 사용자에게 달려 있습니다.
  • 유념하세요 세미콜론이 자동으로 추가되지 않는 규칙 세미콜론이 자동으로 삽입되지 않으면 수동으로 추가하세요
🎜🎜세미콜론이 자동으로 추가되지 않는 규칙🎜🎜🎜다음은 다양한 🎜규칙입니다. 🎜자동으로 세미콜론을 추가하지 않습니다:🎜
  • 새 줄의 코드는 (, [, /) 문자로 시작합니다. > 이 경우에는 일반적으로 Uncaught TypeError로 인해 코드 실행이 실패하게 됩니다.
  • rrreee
    1. 새 줄은 +로 시작됩니다. , -, <.code>*, % 이러한 상황은 대부분 작업 결과에 영향을 미치므로 하나로 병합해야 합니다. line
    rrreee
    1. , 또는 .로 시작하는 새 줄은 주로 분리를 피하기 위해 발생합니다. 코드가 너무 길어도 제대로 수행되면 작업에 영향을 미치지 않습니다.
    rrreee🎜 세미콜론을 추가해야 하는 상황이 발생하는 경우 , 명령문 끝에 세미콜론을 추가하는 것 외에도 "자동으로 앞에 세미콜론을 추가하지 않습니다" 뒤에 세미콜론을 추가할 수도 있습니다. 예를 들어 () 자체는 자동으로 수행되지 않습니다. 그런 필요가 있으면 앞에 ;를 추가하면 됩니다. (ESLint Standard JS 사양 오류를 피하려면 이 방법을 사용하세요.) 🎜rrreee🎜🎜Summary🎜🎜🎜그렇지 않다고 생각하는 사람들도 있습니다. 세미콜론을 추가하면 코드가 더욱 깔끔하고 간결해 보이고, 대부분의 경우 오류가 발생하지 않기 때문에 많은 사람들이 코드를 입력할 때 세미콜론을 추가하지 않습니다. 🎜🎜하지만 저는 좀 더 엄격한 사양을 선호합니다. 백엔드에서 프런트엔드로 전환했기 때문에 어떤 스타일이 좋든 간에 운용상의 제약만 이해하면 됩니다.

    위 내용은 세미콜론이 있는 JavaScript 코드와 없는 JavaScript 코드의 차이점 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제