자바 script 기본 편 1: 자바 script 성명 향상

3850 단어
Javascript 성명 향상
성명 이 향상 되 기 전에 알 아야 할 두 가지 가 있다 고 생각 합 니 다.
1. 엔진 조회 변수의 두 가지 방식
엔진 에서 변 수 를 조회 하 는 방식 은 LH 와 RHS 두 가지 로 나 눌 수 있 는데 'L' 과 'R' 을 통 해 뜻 을 대충 알 수 있 는데 각각 할당 작업 의 왼쪽 과 오른쪽 이다.('=' 으로 만 이해 할 수 없 는 좌우 측 은 안 됩 니 다. 할당 작업 의 형식 이 다양 하기 때 문 입 니 다.)
간단하게 말 하면 저 는 이 두 가지 조회 방식 에 대한 이 해 를 하 겠 습 니 다. LH: 할당 작업 의 목 표 는 누구 입 니까?(변수 조회) RHS: 할당 작업 의 원본 이 누구 입 니까?(변수의 값 조회)
이렇게 말 하 는 것 은 이해 하기 어 려 울 수도 있 으 니 밤 을 들 어 라.
function foo(a){
    //            ,LHS    a,   2.
    //  a = 2;
    //  LHS    b,          b    。
    //  RHS    a  , a   b。
    var b = a;
    //  a,b RHS    a     b     。
    return a + b;
}
//  LHS    c,          c    。
//  RHS    foo, 2       。
var c = foo(2);   


이상
이상 에 대해 강조 하려 면 엄격 한 패턴 에서 해 야 한다.엄격 하지 않 은 모드 에서 LH 검색 이 최상 위 전역 역할 영역 에서 검색 할 변 수 를 찾 지 못 하면 엔진 에 반환 할 이름 변 수 를 만 들 기 때문이다.
Reference Error: 역할 영역 판별 실패 와 관련 이 있 습 니 다.(예 를 들 어 역할 영역 에서 필요 한 변 수 를 찾 을 수 없습니다) TypeError: 역할 영역 판별 은 성 공 했 지만 결과 에 대한 조작 은 불법 또는 불합리 합 니 다.(예 를 들 어: 비 함수 형식의 값 을 함수 호출 하거나 null 또는 undefined 형식의 값 의 속성 을 참조 하려 고 합 니 다)
밤 을 들다
"strict"
function foo() {
    console.log(a) //undefined
    console.log(b) //ReferenceError
}
var a = 2;

성명 승진
초보 적 이해
javascript 코드 를 작성 할 때 코드 가 위 에서 아래로 실 행 될 것 이 라 고 생각 할 때 가 많 습 니 다.그러나 성명 이 올 라 가면 이런 생각 은 깨 질 것 이다.
밤 을 들다
a = 2;
var a;
console.log(a);

     : 2

만약 에 상식 적 으로 위 에서 아래로 집행 한다 면 a 집행 의 기대 결 과 는 undefined 여야 한다. 그런데 왜 2 일 까?이것 이 바로 성명 승진 의 결과 다.
2. 더 알 아 보기
성명 이 향상 되 었 다 는 것 을 초보 적 으로 알 았 을 때 아래 코드 를 만 났 습 니 다.
console.log(a);
var a = 2;

     :undefined

성명 이 올 라 가면 자 연 스 럽 게 성명 이 올 라 갈 것 이 라 고 생각 하지만 성명 할 때 값 을 부여 하지만 변수의 값 을 얻 지 못 합 니 다.
사실 위의 코드 의 운행 절 차 는 다음 과 같이 나 눌 수 있다.
var a; //    
console.log(a); //  a  
a = 2; // a    

원래 성명 향상 은 말 그대로 성명 향상 이 고 나머지 작업 (예 를 들 어 할당 과 다른 논리) 은 제자리 에 있 습 니 다.
함수 가 해당 하 는 조작 을 하 는 것 을 설명 하면 함수 성명 이 향상 되 는 결 과 를 얻 을 수 있 습 니 다.이 를 통 해 알 수 있 듯 이 변수 와 함수 의 성명 은 다른 코드 앞에서 실 행 될 것 이다.
3. 점차적으로 이해
몇 번 의 시험 을 통 해 알 수 있 듯 이 성명 의 향상 은 바로 변수 와 함수 의 성명 이 다른 코드 (현재 역할 영역) 앞에서 실 행 될 것 이다.
여기까지 오 면 함수 표현 식 이 라면 올 라 갈 수 있 을 까?
정 답 은: 아니요.그리고 구명 함수 표현 식 이라도 이름 식별 자 할당 전에 사용 할 수 없습니다.
밤 을 들다
foo(); //TypeError
bar(); //ReferenceError
var foo = function bar(){};

코드 분해:
var foo; //      
foo(); //foo undefined             , TypeError
bar(); //bar       , ReferenceError
foo = function bar(){}; // foo    

따라서 함수 표현 식 은 이름 식별 자 할당 전에 사용 할 수 없습니다.
주의: 1. 모든 역할 영역 에서 향상 작업 을 합 니 다.(따라서 함수 내부 에 형 성 된 역할 영역 도 향상 작업 이 있 고 향상 작업 은 현재 함수 내부 역할 영역 만 제한 합 니 다) 2. 함수 와 변수 가 향상 되 었 을 때 함수 가 우선 향상 되 었 습 니 다.3. 일반 블록 내부 의 함수 성명 은 보통 해당 역할 영역의 맨 위로 올 라 갑 니 다.
깊이 이해 하 다
'당신 이 모 르 는 자바 script' 을 읽 을 때 let 를 배 우 는 과정 에서 let 를 사용 한 성명 은 역할 영역 에서 향상 되 지 않 는 다 는 설명 이 있 습 니 다.성명 의 코드 는 실행 되 기 전에 성명 이 존재 하지 않 습 니 다.
밤 을 들다
console.log(a);
let a = 2;

     :ReferenceError: Cannot access 'a' before initialization. //        "a"

그리고 내 가 실행 한 코드 로 돌아 가 let 를 var 로 바 꾸 고 돌아 온 결 과 는 undefined 입 니 다.
두 사람 이 결합 한 데다 가 읽 는 데 두 달 이 걸 려 서 야 let 라 는 글 을 이해 하 게 되 었 는데 let 가 업 데 이 트 된 인식 을 가지 게 되 었 는 지 알 게 되 었 다.
저 자 는 js 변 수 를 세 부분 으로 나 누 었 습 니 다. 생 성 (create), 초기 화 (initialize), 할당 (assign) 입 니 다.
위의 작업 이 서로 다른 응답 을 하 는 이 유 는 let 가 만 들 지 않 았 다 는 것 이 아니 라 초기 화 과정 이 실행 되 지 않 았 기 때 문 입 니 다.초기 화 되 기 전에 변 수 를 사용 하면 일시 적 인 사각 지대 가 형성 된다.
var 와 let 와 function 의 테스트 를 통 해 다음 과 같이 요약 할 수 있 습 니 다.
  • var 의 생 성과 초기 화 는 향상 되 고 할당 은 향상 되 지 않 습 니 다.
  • let 의 생 성 이 향상 되 고 초기 화 와 할당 이 향상 되 지 않 습 니 다.
  • function 의 생 성, 초기 화, 할당 이 모두 향상 된다.
  • 좋은 웹페이지 즐겨찾기