자 바스 크 립 트 의 대괄호 "{}" 의 다 의성 분석

2264 단어
JS 에서 대괄호 는 네 가지 의미 작용 이 있다
어의 1, 복합 문 구 를 조직 하 는 것 이 가장 흔히 볼 수 있 는 것 이다.
 
  
if( condition ) {
  //...
}else {
  //...
}
for() {
  //...
}

의미 2, 대상 직접 량 성명
 
  
var obj = {
    name : 'jack',
    age : 23
};

전체 값 부여 문 입 니 다. {name: jack, age: 23} 은 표현 식 입 니 다.
의미 3, 성명 함수 또는 함수 직접 량
 
  
function f1(){
    //...
}

var f2 = function(){
    //...
}

f1 과 비 f2 의 차 이 는 전자 가 문법 해석 기 에 있 고 후 자 는 운행 기 에 있다 는 것 이다.차이 점 은 이 함수 의 코드 를 함수 정의 후에 호출 하면 차이 가 없다 는 것 이다.이 함수 의 코드 를 함수 정의 전에 호출 하면 f1 은 호출 할 수 있 고 f2 는 오 류 를 보고 하여 f2 가 정의 되 지 않 았 음 을 알려 줍 니 다.
의미 4, 구조 화 이상 처리 문법 기호
 
  
try {
    //...
}catch( ex ){
    //...
}finally{
    //...
}

여기에 있 는 대괄호 와 일치 하 는 문장 (의미 1) 은 차이 가 있 습 니 다. 대괄호 에 한 문장 만 있 으 면 if / else / for 등에 서 대괄호 는 생략 할 수 있 지만 try / catch / finally 는 생략 할 수 없습니다.
다음 코드 는 N 구 를 꼬 았 습 니 다.
 
  
function(){}() // ,
{}.constructor // ,

왜 []. constructor 가 이렇게 썼 는데 도 틀 리 지 않 는 지 이해 할 수 없다. 하 나 는 대상 의 직접 양 을 얻 으 려 는 구조 기 이 고, 하 나 는 배열 의 직접 양 을 얻 으 려 는 구조 기 일 뿐이다.
물론 변 수 를 추가 해서 받 아 도 틀 리 지 않 습 니 다.
var c = {}.constructor;
같은 상황
var fn = function () {} () 도 틀 리 지 않 습 니 다.
실제 적 으로 js 의 '문구 우선' 이 이상 한 짓 을 하고 있 습 니 다. 즉, {} 은 대상 의 직접 양 (의미 2) 이나 성명 함수 (의미 3) 의 의미 가 아 닌 복합 구문 블록 (의미 1) 으로 이해 되 고 있 습 니 다.
function () {} (), 괄호 는 복합 문장 으로 이해 되 며, 자 연 스 럽 게 앞의 function () 성명 함수 의 문법 이 완전 하지 않 아 문법 분석 기 에 오류 가 발생 합 니 다.{}. constructor, 대괄호 는 복합 문 으로 이해 되 고 대괄호 뒤 에는 점 연산 자 이 며 점 연산 자 앞 에 합 리 적 인 대상 이 없 으 면 자 연 스 럽 게 잘못 보고 합 니 다.
복구 방식 은 잘 알려 져 있 습 니 다. 강제 연산 자 () (function () {}), (function () {}), /함수 (의미 3) 로 강제로 이해 하고 '함수 ()' 는 이 함 수 를 실행 하 는 것 을 표시 합 니 다. 즉, 성명 후 즉시 실 행 됩 니 다.({}). constructor / / ({}) 는 대괄호 를 대상 의 직접 양 (의미 2) 으로 강제로 이해 하고, '대상. xx' 는 대상 을 가 져 오 는 구성원 을 표시 하 며, 자 연 스 럽 게 뒤의 점 연산 자 를 정상적으로 실행 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기