유데미에서는 자세히 다루지 않았지만 나중에도 나올 중요한 개념이기도 하고
알아두면 좋을것 같아서 따로 검색해서 저장해 놓기로 했습니다.
표현식은 값을 산출해내는 코드를 의미한다. 값이 도출되기 때문에 함수의 인자로 들어갈 수 있다.
1;
5 + 5;
'Hello world';
exFunc('a','b');
exam;
console.log(true && 1 * 5) // 5
const a = 1; // 이건 statement이다. a는 상태이다.
a * 2 // 표현식
a + 1 // 표현식
a - 1 // 표현식
console.log(a); // 1
const test = test() => {
a = 11;
}
const test = test() => {
return 10; // 가독성을 위한 명시적 반환
}
testResult = test()
또는
const test = test(n) => {
return n // 가독성을 위한 명시적 반환
}
testResult = test(10)
이 편이 가독성이 더 좋고, 어딘가에 끼워넣기 좋으며 표현식(Expression)과 문장(Statement) 사이에서 확연히 구분된다. 이것이 선언적이고 함수적인 자바스크립트의 기반이다.
기본적으로 문장은 무언가 수행한다. 자바스크립트에서 문장은 값이 들어와야 할 곳에 들어갈 수 없다. 그래서 함수의 인자, 대입 연산의 값, 연산자의 피연산자 등에 사용될 수 없다.
자바스크립트의 문장(Statements)은 다음과 같다.
함수 선언(Statement)은 문장이다.
function a (test) {
return test.name;
}
console.log(a(function(){} )); // ""
console.log(a(function myName(){} )); // "myName"
if() {
function a() {} // 블록의 가장 상위 레벨, 함수 선언
}
function a() {} // 전역 레벨, 함수 선언
function a() {
function b() {} // 블록의 가장 상위 레벨, 함수 선언
}
function a() {
return function b() {} // 네임드 함수 표현식
}
a(function() {}) // 익명 함수 표현식
function a () {
return function b() {
function c() {} // 블록의 가장 상위 레벨, 함수 선언
}
}
function() {} // 문법 에러: 함수 문장(statement)은 이름이 필요하다.
표현식(Expressions)을 표현식 문장(Expression Statements)으로 바꿀 수 있다. 마지막에 세미콜론만 추가하면 된다.
1+1 // 이 자체로는 표현식
a(1+1) // 그래서 어디든 값이 들어가야 할 곳에 사용가능
true ? 1+1 : 2+2
function a() {return 1+1}
1+1; // 표현식 문장(Expression Statements)
a(1+1;) // 문법 에러(Syntax Error)
세미콜론을 붙이면, 여러 줄의 문장(Statements)을 하나의 줄에 넣을 수 있다.
const a; function b() {}; const c = 1;
console.log((1+2, 3, 4)) // 4
console.log((1, 6/3, function() {})) // function() {}
console.log((1, true ? 1+1 : 2+2)) // 2
function a() {return 1, 2, 3, 4}
a() // 4
모든 표현식은 왼쪽에서 오른쪽으로 계산된다. 그리고 마지막 게 리턴된다.
익명 함수는 표현식으로 쓰일 수 있다. 자바스크립트에서 값이 들어갈 곳에 쓰일 수 있다면, 자바스크립트에서 값이 들어갈 곳에 괄호를 쓸 수 있다면 익명 함수를 값으로 넘길 수 있다는 것을 의미한다.
function() {} // 에러
(function() {}) // function() {}를 리턴한다.
(function() {
// do something
})()
(function () {
console.log("익명함수 호출");
})() // "익명함수 호출"
(function() {
return 1;
})() // 1
console.log((function() {
return 2;
})()) // 2
// 인자를 넘길 수도 있다.
(function(a) {
return a;
})("test"); // "test"
r: 1+1 // 유효
test()
const test = () => {}
loop: {
for(const i=0; i<2; i++) {
for(const n=0; n<2; n++) {
break loop; // 바깥 루프를 중단해 전체 루프를 중단한다.
}
}
}
test: function a() {}
console.log(test) // ReferenceError: test is not defined
console.log({a: "b"}); // {a: "b"} 오브젝트 리터럴
console.log({let a = "b", func(), 1+1}) // SyntaxError 블록 문장
const test = {let a = "b", func(), 1+1} // SyntaxError 블록 문장
{} + 1 // 1
{1} + 2 // 1
{1+1} + 2 // 2
{1+1} - 2 // 2
문장(statement)은 값으로 쓰일 수 없으므로 어느 것도 반환하도록 되어있지 않다. 그래서 자바스크립트는 Error 대신 + 연산자의 피연산자를 숫자나 문자열로 바꾼다. 여기서 바꿀 수 없는 값이라면 이때 Error를 내보낸다. 블록 문장(block statements)에서 무엇이 반환되던지 그것은 암묵적으로 0으로 강제 형 변환되어 피연산자로 사용된다.