1. 명령문과 표현식
JavaScript에서는 표현식과 명령문 사이에 차이가 있습니다. 표현식은 값을 생성하며, 예를 들어 함수 호출 매개변수로 값이 필요한 곳에 배치할 수 있습니다. 아래 코드 줄은 표현식입니다.
myvar3 xmyfunc("a", "b") 문은 루프 문으로 이해될 수 있으며, if 문은 일반적인 문으로 구성됩니다. 일련의 명령문. JavaScript에서 명령문이 필요할 때마다 표현식을 사용할 수 있습니다. 이러한 명령문을 표현식 명령문이라고 합니다. 그러나 그 반대는 성립하지 않습니다. 표현식이 필요한 곳에는 표현식을 사용할 수 없습니다. 예를 들어, if 문은 함수의 매개변수로 사용할 수 없습니다.
2. 기타 구문
이를 이해한 후 다음 두 쌍을 살펴보세요.
2.1 If 문과 조건 연산자
다음은 if 문의 예입니다.
var x
if (y >= 0) {
x = y;
} else {
x = -y;
}
if 문 함수와 유사한 표현식을 조건 연산자라고 합니다.
var x = (y >= 0 ? y : -y)
등호 =와 세미콜론 사이의 코드는 조건식입니다. 양쪽에 괄호 필수는 아니지만 괄호를 사용하면 조건식을 더 쉽게 읽을 수 있다고 생각합니다.
2.2 세미콜론 및 쉼표 연산자
JavaScript에서는 세미콜론을 사용하여 두 문을 연결합니다.
foo (); bar() 두 표현식을 연결하려면 일반적이지 않은 쉼표 연산자가 사용됩니다.
foo(), bar() 쉼표 연산자는 전후의 두 표현식을 평가한 다음 다음의 계산 결과를 반환합니다. 예를 들어,
> "a", "b"
'b'
> var x = ("a", "b")
> >
> console.log(("a", "b"))
3. 문장처럼 보이는 표현
표현식은 명령문처럼 보이기 때문에 문제가 발생할 수 있습니다.
3.1 객체 리터럴 및 명령문 블록
다음은 객체 리터럴로, 객체 값 Formula를 생성할 수 있는 표현식입니다. >
코드 복사
}
그러나 동시에 이는 완전히 합법적인 진술이기도 합니다.
• 코드 블록: 중괄호로 둘러싸인 블록 시퀀스
•레이블: 모든 명령문 앞에 레이블을 붙일 수 있습니다.
•문: 표현식 명령문 bar(3, 5) JavaScript가 실제로 독립적인 코드 블록을 가질 수 있다는 사실에 충격을 받았습니다(일반 코드 블록은 루프 또는 if 문을 기반으로 함). 다음 코드는 이 코드 블록의 기능을 보여줍니다. 이에 대한 레이블을 설정하고 이 코드 블록에서 벗어날 수 있습니다. >
코드 복사
console.log("Two")
}
console.log(" Three" );
}
> 테스트(false)
하나
셋
> 테스트(true)
하나
둘
셋
3.2 함수 표현식 및 함수 선언
다음 코드는 함수 표현식입니다.
function () { } 이 함수 표현식에 이름을 지정하고 변환할 수도 있습니다. ) 함수 표현식:
function foo() { }이 함수의 함수 이름(foo)은 함수 내부에만 존재합니다. 예를 들어, 이를 사용하여 재귀 작업을 수행할 수 있습니다.
코드 복사
ReferenceError: me가 정의되지 않았습니다. 🎜>
표면적으로 명명된 함수 표현식은 함수 선언과 다르지 않습니다. 그러나 그 효과는 다릅니다. 함수 표현식은 값(함수)을 생성합니다. 작업을 수행합니다. 또한, 함수 표현식만 즉시 호출할 수 있으며, 함수 선언은 호출할 수 없습니다.
3.3 충돌 해결
3.1과 3.2에서 볼 수 있듯이 일부 표현식에서는 표현식과 명령문 사이에 뚜렷한 차이가 없습니다. 이는 동일한 코드가 표현식 컨텍스트에 나타날 때와 명령문 컨텍스트에 나타날 때 서로 다른 효과가 있음을 의미합니다. 그러나 표현식 문인 경우에는 중복되지 않습니다. 즉, 이 모호함을 해결하기 위해 JavaScript 구문에서는 중괄호로 된 표현식 문을 금지하거나 키워드 " function"이
ExpressionStatement:
[lookahead ∉ {"{", "function" }] 표현식
그러면 해당 플래그로 시작하는 표현식 문을 작성하려면 어떻게 해야 할까요? 내부적으로는 연산 결과가 바뀌지 않습니다. 두 가지 예를 살펴보겠습니다. 첫 번째 예: eval은 명령문 컨텍스트에 따라 매개변수를 구문 분석합니다. eval이 객체를 반환하려면 객체 리터럴 주위에 대괄호를 추가해야 합니다. .
> 123 }")
123
> eval("({ foo: 123 })")
{ foo: 123 }
두 번째 예: 다음 예는 즉시 실행되는 함수식
> (function () { return "abc" }())
'abc'
괄호를 생략하면 A 구문 오류가 발생합니다(함수 선언은 익명일 수 없음).
> function () { return "abc" }( )
SyntaxError: 함수 문에 이름이 필요합니다
함수 이름을 추가하면 구문 오류도 발생합니다(함수 문을 이해하고 실행할 수 없음):
> function foo() { return "abc" }()
SyntaxError: 구문 오류
표현식 컨텍스트에서 표현식을 구문 분석하는 또 다른 방법은 or!와 같은 단항 연산자를 사용하는 것입니다. 그러나 괄호를 사용하는 것과는 달리 이러한 연산자는 결과를 변경합니다. 결과에 관심이 없다면 다음을 사용할 수 있습니다.
> function () { console.log("hello") }()
hello
NaNNaN
은 함수 실행 후 반환 값이 정의되지 않았습니다.
번역가의 메모: 번역이 명확하지 않다고 생각하여 수준이 좋지 않은 그림을 그렸습니다.
원문은 다음과 같습니다. (영어):
http://www.2ality.com/2012/09/expressions-vs-statements.html