es6 블록 급 작용 역 의 사용 을 깊이 이해 하 다

1.var 성명 과 변수 향상 메커니즘
자 바스 크 립 트 에서 var 를 사용 하여 변 수 를 정의 합 니 다.전역 작용 역 함수 함수 의 국부 작용 역 을 정의 하 든 그 작용 역 의 맨 위로 향 상 됩 니 다.이것 도 자 바스 크 립 트 정의 변수의 곤 혹 스 러 운 부분 입 니 다.es5 는 다른 종류의 C 언어 와 같은 블록 급 역할 영역 이 없 기 때문에 es6 는 let 정의 변 수 를 추가 하여 블록 급 역할 영역 을 만 들 었 습 니 다.
var 정의 변수의 예 시 를 살 펴 보 겠 습 니 다.

function  setName(){
  if(condition){
    var name = 'loho';
    console.log(name);
  }else{
    console.log(name);
  }
}

var student = 'eveningwater';
setName();

상기 코드 는 다음 과 같이 이해 할 수 있 습 니 다.

var student;
function setName(){
  var name;
  if(condition){
    name = 'loho';
    console.log(name);//loho
  }else{
   console.log(name);//undefined
  }
}
student = 'eveningwater';
setName();
블록 급 성명
블록 급 성명 은 블록 급 역할 영역 을 지정 하여 블록 급 역할 영역 에서 정의 하 는 변 수 를 더 이상 전역 적 으로 접근 할 수 없 게 하고 블록 급 역할 영역 도 품사 역할 영역 이 라 고 부 릅 니 다.
블록 급 역할 영역 은 두 곳 에 존재 합 니 다:
  • 함수 내부.
  • 지정 코드 블록 중.(즉"{"와"}"사이 의 구역)
  • 1.let 성명
    let 성명 은 var 성명 용법 과 일치 합 니 다.유일한 차이 점 은 let 성명 이 변 수 를 한 블록 에 제한 하면 블록 급 역할 영역 이 형성 되 기 때문에 변수의 향상 도 존재 하지 않 습 니 다.
    예 를 들 어 앞의 예 시 를 우 리 는 다음 과 같이 쓸 수 있다.
    
    let stundent = 'eveningwater';
    function setName(){
      if(condition){
        let name = 'loho';
        console.log(name);//loho
      }else{
        //     false     
        console.log(name);//    
      }
    }
    setName();
    
    
    2.재 성명 금지
    let 정의 변 수 를 사용 하기 전에 같은 변 수 를 설명 하면 오류 가 발생 합 니 다.따라서 변 수 를 반복 할 수 없습니다.다음 예제 와 같다.
    
    var name = 'eveningwater';
    //  ,    
    let name = 'loho';
    물론 이 두 변 수 는 같은 역할 영역 에 있어 야 하 며,서로 다른 역할 영역 에 있다 면 잘못 보고 하지 않 을 것 이다.그러나 첫 번 째 성명 의 변 수 를 가 릴 수 있다.다음 예제 와 같다.
    
    var name = 'eveningwater';
    if(condition){
      //    
      let name = 'loho';
    }
    
    3.const 성명
    const 식별 자 를 사용 하여 설명 한 변 수 는 초기 화 되 어야 하기 때문에 이 성명 은 상수 입 니 다.다음 예:
    
    const name='eveningwater';//  
    const name;//  ,    
    const 성명 은 let 성명 과 마찬가지 로 블록 급 역할 도 메 인 을 만 들 었 습 니 다.이 블록 급 역할 도 메 인 외 에 설명 한 변 수 를 방문 할 수 없습니다.다시 말 하면 const 가 설명 한 변 수 는 변수 향상 메커니즘 이 없 을 것 이다.다음 예:
    
    if(condition){
        const name = 'eveningwater';
        console.log(name);//'eveningwater'
    }
    //  
    console.log(name);
    
    같은 const 도 중복 성명 할 수 없습니다.다음 과 같 습 니 다.
    
    var name = 'eveningwater';
    //  ,      
    const name = 'loho';
    
    그러나 서로 다른 역할 영역 에서 반복 적 으로 성명 할 수도 있 습 니 다.다음 과 같 습 니 다.
    
    var name = 'eveningwater';
    if(condition){
      const name = 'loho';
      console.log(name);//loho,         
    }
    
    비록 const 성명 과 let 성명 이 너무 비슷 한 부분 이 많 지만 const 성명 도 let 성명 과 다른 점 이 있 습 니 다.바로 const 성명 의 변 수 는 할당 되 지 않 습 니 다.엄격 하지 않 은 모드 에서 든 엄격 한 모드 에서 든 const 성명 의 변 수 를 할당 할 수 없습니다.다음 예:
    
    const name = 'eveningwater';
    //  
    name = 'loho';
    
    단,대상 을 정의 하면 대상 의 값 을 수정 할 수 있 습 니 다.다음 과 같 습 니 다.
    
    const student = {
      name:'eveningwater'
    }
    student.name = 'loho';//   
    //  ,         
    student = {
      name:'loho'
    }
    
    4.임시 사각 지대
    앞에서 언급 한 let 와 const 성명 의 변 수 는 역할 필드 의 맨 위 에 올 라 가지 않 기 때문에 이 두 개의 식별 자 성명 을 사용 하기 전에 방문 하면 오류 가 발생 할 수 있 습 니 다.type:of 연산 자 라 도 인용 오류 가 발생 할 수 있 습 니 다.다음 예:
    
    console.log(typeof name);//  
    const name = 'eveningwater';
    첫 번 째 줄 코드 가 잘못 되 었 기 때문에 후속 성명 변수 문 구 는 실행 되 지 않 습 니 다.이때 자 바스 크 립 트 커 뮤 니 티 의 이른바'임시 사구'(temporal dead zone)가 나 타 났 습 니 다.예 를 들 어 const 성명 이지 만 let 성명 도 마찬가지 입 니 다.
    그러나 const 나 let 에서 설명 한 변수의 역할 영역 외 에 type:of 연산 자 를 사용 하여 감 측 하면 오류 가 발생 하지 않 고 undefined 로 돌아 갈 뿐 입 니 다.다음 예:
    
    console.log(typeof name);//undefined
    if(condition){
      let name = 'eveningwater';
    }
    5.순환 중인 블록 급 역할 영역 바 인 딩
    우 리 는 var 성명 변 수 를 사용 할 때 항상 이런 상황 을 만 납 니 다.다음 과 같 습 니 다.
    
    for(var i = 0;i < 100;i++){
      //      
    }
    //         i
    console.log(i);//100
    
    우 리 는 let 성명 을 사용 하여 변 수 를 순환 으로 제한 할 수 있 습 니 다.이때 순환 작용 영역 밖에서 변 수 를 방문 하면 i 가 잘못 보 고 됩 니 다.let 성명 은 순환 을 위해 블록 급 역할 영역 을 만 들 었 기 때 문 입 니 다.다음 과 같다.
    
    for(let i = 0;i < 100;i++){
      //      
    }
    //  
    console.log(i);
    6.순환 중인 생 성 함수
    var 성명 변 수 를 사용 하 는 순환 에서 함 수 를 만 드 는 것 은 매우 어렵 습 니 다.다음 과 같 습 니 다.
    
    var func = [];
    for(var i = 0;i < 5;i++){
      func.push(function(){
        console.log(i);
      })
    }
    func.forEach(function(func){
      func();
    });
    
    0 에서 5 사이,즉 0,1,2,3,4 의 숫자 를 인쇄 하 는 것 이 라 고 예상 할 수 있 지만 정 답 은 그렇지 않다.함수 가 자신의 역할 영역 이 있 기 때문에 배열 에 함 수 를 추가 할 때 실제 순환 이 완료 되 었 기 때문에 인쇄 변수 i 의 값 은 전체 에서 변수 i 를 방문 하 는 값,즉 i=5 라 는 값 에 해당 하기 때문에 실제 답 은 최종 적 으로 5 번 으로 돌아 갑 니 다.
    es5 에서 우 리 는 함수 표현 식(IIFE)을 사용 하여 이 문 제 를 해결 할 수 있 습 니 다.함수 표현 식 은 자신의 블록 급 역할 도 메 인 을 만 들 기 때 문 입 니 다.다음 과 같다.
    
    var func = [];
    for(var i = 0;i < 5;i++){
      (function(i){
        func.push(function(){
          console.log(i);
        })
      })(i)
    }
    func.forEach(function(func){
      func();//         ,  0,1,2,3,4
    });
    그러나 사실은 es6 의 let 성명 이 있 습 니 다.우 리 는 이렇게 귀 찮 을 필요 가 없습니다.var 를 let 성명 으로 바 꾸 면 됩 니 다.다음 과 같 습 니 다.
    
    var func = [];
    for(let i = 0;i < 5;i++){
      func.push(function(){
        console.log(i);
      })
    }
    func.forEach(function(func){
      func();//  0,1,2,3,4
    })
    
    그러나 여기 서 const 성명 을 사용 할 수 없습니다.앞에서 언급 한 바 와 같이 const 성명 은 상수 로 초기 화 된 후에 수정 할 수 없고 대상 에서 만 값 을 수정 할 수 있 습 니 다.다음 예제 와 같이 잘못 보고 할 것 이다.
    
    //     i++         
    for(const i = 0;i < len;i++){
      console.log(i);
    }
    
    i++이 문 구 는 상수 i 의 값 을 수정 하려 고 시도 하기 때문에 const 성명 을 for 순환 에 사용 할 수 는 없 지만,const 성명 을 for-in 이나 for-of 순환 에 사용 할 수 있 습 니 다.다음 과 같다.
    
    var func = [];
    var obj = {
      name:'eveningwater',
      age:22
    }
    for(let key in obj){
     func.push(function(){
       console.log(key)
     })
    }
    func.forEach(function(func){
      func();//name,age
    });
    //      
    var func = [];
    var obj = {
      name:'eveningwater',
      age:22
    }
    for(const key in obj){
      func.push(function(){
        console.log(key)
      })
    }
    func.forEach(function(func){
     func();//name,age
    });
    
    
    키 의 값 을 수정 하지 않 았 기 때문에 const 와 let 성명 을 사용 해도 됩 니 다.for-of 순환 도 마찬가지 입 니 다.for-of 순환 은 es6 의 새로 추 가 된 나 쁜 것 이다.
    7.전역 역할 영역 바 인 딩
    let,const 성명 과 var 성명 의 또 다른 차이 점 은 세 사람 이 전체 역할 영역 에서 의 행위 이다.var 를 사용 하여 변 수 를 설명 할 때 전역 역할 영역(일반적으로 브 라 우 저 window 대상)에서 전역 속성 을 만 듭 니 다.이것 은 window 대상 에 존재 하 는 전역 변 수 를 덮어 쓸 수 있 음 을 의미 합 니 다.다음 예:
    
    console.log(window.Array);//             , f Array(){}
    var Array = '    ';
    console.log(window.Array);//  '    ';
    
    위의 예 를 들 어 전역 역할 영역 에서 Array 변 수 를 정의 하거나 Array 속성 이 존재 하 더 라 도 나중에 정의 한 Array 변 수 는 이전에 정 의 된 Array 변수(속성)를 덮어 씁 니 다.
    그러나 es6 의 let 와 const 성명 은 이러한 상황 이 발생 하지 않 습 니 다.let 와 const 성명 은 새로운 바 인 딩 을 만 듭 니 다.즉,window 대상 의 속성 이 되 지 않 습 니 다.설명 한 변 수 는 전역 변 수 를 덮어 쓰 지 않 고 가 려 진 다 는 것 이다.다음 예:
    
    let Array = '    ';
    console.log(Array);//'    ‘;
    console.log(window.Array);//             , f Array(){}
    
    그 러 니까 window.Array!==Array 이 등식 은 불 값 true 를 되 돌려 줍 니 다.
    8.블록 급 귀속 의 최 적 실천
    es6 블록 급 성명 변 수 를 사용 할 때 가장 좋 은 실천 은 이 변수의 값 을 나중에 바 꾸 지 않 을 것 이 라 고 확정 하면 const 로 설명 하고 이 변수의 값 을 바 꾸 려 면 let 로 설명 하 는 것 입 니 다.예상 치 못 한 변수 값 이 바 뀌 었 을 때 많은 bug 가 나타 나 는 원본 이기 때 문 입 니 다.다음 예제:
    
    function eveningWater(){};
    eveningWater.prototype.name = 'eveningwater';
    let ew = new eveningWater();
    //          ,              
    const _constructor = ew.constructor;
    //            
    let name = ew.name;
    if(_constructor === eveningWater || _constuctor === Object){
     console.log(_constructor);
    }else{
      name = 'loho';
      console.log(name)
    }
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기