이 문제는 ESlint 사양에서도 세미콜론 추가 여부에 따라 두 가지 진영으로 나뉘며, 세미콜론 추가 여부에 대해서는 이해하는 것이 중요합니다. 세미콜론이 JavaScript에 미치는 영향. 시작하기 전에 다음 인터뷰 질문을 살펴보세요.
이 코드가 정상적으로 실행될 수 있나요?
var a = 1 (function() { console.log(2) })()
이 코드를 실행하면 다음 오류가 나타납니다.
Uncaught TypeError: 1 is not a function
뭐야! 1은 함수가 아닙니다
? 우리는 숫자 1을 실행할 의도가 없었습니다. 숫자 1이 함수가 아닌 이유는 무엇입니까? 이런 종류의 오류는 찾기 어렵고 종종 문제가 있는 코드 줄 주위를 맴돕니다. 이 오류는 위 코드가 런타임 시 동일한 라인으로 간주되기 때문에 발생합니다. 개념은 다음과 같습니다. 1 is not a function
?我们没有打算运行数字 1,为什么说数字 1 不是函数,这种错误是很难找到原因的,经常会在出问题的代码行上打转。这个错误必然是上吗的代码在运行时被看作是同一行,其概念如下:
var a = 1(function() { /* */ })()
因此立即函数的 ()
被附加在 1 上,这是一个调用函数的语法,所以会产生 1 is not a function
的错误,想要避免这个错误就需要使用分号:
var a = 1 // 随便把分号放在哪里,只要能隔开就行 ;(function() { console.log(2) })()
ASI是 “Automatic Semicolon Insertion” 的缩写,在运行时会往有些折行的代码中自动插入分号,这个机制可以使部分代码在没有加入分号时也能正常运行,比如下面的例子:
var b = 1 ++b console.log('b', b)
由于代码中的 ++
属于一元表达式,它只能在表达式的左边或右边放置变量,如果没有 ASI 的机制,代码会被转换为 var b = 1 ++ b
这样的错误语句。不过好在有 ASI,在实际运行时会自动被加入分号,也就不会出现上面的错误。
var b = 1; ++b; console.log('b', b); // 2
再来看一个例子,下面的代码在 return
的后面空一行后再写要返回的值,那么问运行结果是什么呢?
function fn() { return '小明' } console.log(fn())
这段程序代码因为 ASI 的修正,return
的后面会被加上一个分号,所以 return
与预期返回的值被分开了,结果 return
的内容为空值,最终的结果也只能是 undefined
。
function fn() { return; '小明'; } console.log(fn()); // undefined
本来 ASI 是出于一片好心,用来修正没有加入分号的代码片段,但偏偏在有的地方并没有发挥它的作用(例如本文一开始所介绍的立即函数),导致代码出现了错误;甚至有些代码不会出错,但会使你的代码执行结果和预期相差万里。
解决 ASI 问题的方式如下:
下面时各种不会自动加入分号的规则:
(
、[
、/
字符开始的,这类情况一般会直接出现 Uncaught TypeError
从而导致代码无法运行。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 声明
如果遇到需要加入分号的情况,除了可以在语句的末尾加入分号外,也可以把分号加在“不会自动加入分号”的最前方,例如 ()
本身不会自动加入分号,在有这种需求时可以将 ;
// 运行错误 (function() { })() (function() { })() // 正确 ;(function() { })() ;(function() { })()
()
가 1에 추가됩니다. 함수 구문을 호출하면 1은 함수가 아닙니다
오류가 발생합니다. 이 오류를 피하려면 세미콜론을 사용해야 합니다. ++
는 단항 표현식이므로 ASI 메커니즘이 없으면 표현식의 왼쪽 또는 오른쪽에만 변수를 배치할 수 있습니다. var b = 1 ++ b
로 변환됩니다. 이러한 오류 설명입니다. 하지만 다행히 ASI를 사용하면 실제 연산 중에 세미콜론이 자동으로 추가되므로 위와 같은 오류는 발생하지 않습니다. rrreee
return과 세미콜론의 관계다음 코드에서 return
뒤에 빈 줄 뒤에 반환할 값을 작성해 보겠습니다. ? rrreee
return
뒤에 세미콜론이 추가되므로 return
이 예상 반환 값과 분리되어 결과는 다음과 같습니다. return의 내용은 null 값이며 최종 결과는 정의되지 않음
만 가능합니다. 🎜rrreee🎜세미콜론은 어떻게 처리해야 할까요🎜🎜원래 ASI는 좋은 의도에서 세미콜론이 포함되지 않은 코드 조각을 수정하는 데 사용되었지만 일부에서는 제 역할을 하지 못했습니다(예: 이 문서의 시작 부분에 있는 함수)로 인해 코드에 오류가 발생합니다. 일부 코드에서도 오류가 발생하지 않지만 코드 실행 결과는 예상과 수천 마일 다를 수 있습니다. 🎜🎜ASI 문제를 해결하는 방법은 다음과 같습니다: 🎜(
, [
) 문자로 시작합니다. >, /
, 이러한 종류의 상황은 일반적으로 Uncaught TypeError
를 직접적으로 발생시켜 코드 실행에 실패하게 합니다. +
로 시작합니다. -
, *
, %
는 대부분 작업 결과에 영향을 미치므로 ,
또는 로 시작합니다. 주로 이러한 사용법이 발생합니다. 너무 긴 코드가 분리되는 것을 방지하려면 이 상황을 올바르게 사용하면 코드를 더 쉽게 읽을 수 있습니다.
()
자체는 자동으로 추가됩니다. 자동으로 세미콜론을 추가하지 마세요. 필요한 경우 ; code>를 앞에 추가하면 됩니다. (ESLint Standard JS 사양에서는 오류를 피하기 위해 이 방법을 사용합니다.) 🎜rrreee🎜Summary🎜🎜어떤 사람들은 그렇게 생각합니다. 세미콜론을 추가하지 않으면 코드가 더 깔끔하고 간결해 보이지만 대부분의 경우 오류가 발생하기 때문에 코드를 입력할 때 세미콜론을 추가하지 않는 경우가 많습니다. 🎜🎜하지만 저는 더 엄격한 사양을 선호합니다. 백엔드에서 프론트엔드까지, 운영상의 한계를 이해한다면 어떤 스타일이 좋든 상관없습니다. 🎜🎜더 많은 프로그래밍 관련 지식을 보려면 다음을 방문하세요. 🎜소개 프로그래밍🎜까지!
위 내용은 JS 코드에서 세미콜론을 추가하는 것과 세미콜론을 추가하지 않는 것의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!