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 问题的方式如下:
不会被自动加入分号的规则
下面时各种不会自动加入分号的规则:
(
、[
、/
字符开始的,这类情况一般会直接出现 Uncaught TypeError
从而导致代码无法运行。function fn() { return; '小明'; } console.log(fn()); // undefined
+
,-
,*
,%
开始,这类情况大多会影响运算结果,所以应该合并为一行。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)
,
或 .
开始,这种用法经常会出现,主要是为了避免代码过长而加入的分隔,这种情况并不会影响运行,如果善用的话会使代码更容易阅读。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
로 인해 코드 실행이 실패하게 됩니다. +로 시작됩니다.
, -
, <.code>*, %
이러한 상황은 대부분 작업 결과에 영향을 미치므로 하나로 병합해야 합니다. line
,
또는 .
로 시작하는 새 줄은 주로 분리를 피하기 위해 발생합니다. 코드가 너무 길어도 제대로 수행되면 작업에 영향을 미치지 않습니다. ()
자체는 자동으로 수행되지 않습니다. 그런 필요가 있으면 앞에 ;
를 추가하면 됩니다. (ESLint Standard JS 사양 오류를 피하려면 이 방법을 사용하세요.) 🎜rrreee🎜🎜Summary🎜🎜🎜그렇지 않다고 생각하는 사람들도 있습니다. 세미콜론을 추가하면 코드가 더욱 깔끔하고 간결해 보이고, 대부분의 경우 오류가 발생하지 않기 때문에 많은 사람들이 코드를 입력할 때 세미콜론을 추가하지 않습니다. 🎜🎜하지만 저는 좀 더 엄격한 사양을 선호합니다. 백엔드에서 프런트엔드로 전환했기 때문에 어떤 스타일이 좋든 간에 운용상의 제약만 이해하면 됩니다.위 내용은 세미콜론이 있는 JavaScript 코드와 없는 JavaScript 코드의 차이점 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!