네가 모르는 자바스크립트 독서 노트

4722 단어
  • 소위 의 3단계
  • 분사/문법분석: 문자로 구성된 문자열을 의미 있는 코드 블록으로 분해한다.var a = 1;:var,a,=,2,;
  • 해석/문법분석: 문법 단원 흐름을 하나의'추상적 문법 트리'(Abstract Syntax Tree,AST)로 변환
  • 코드 생성:AST를 실행 가능한 코드로 변환
  • 작용역은 명칭에 따라 변수를 찾는 일련의 규칙이다.
  • '어법 작용역'은 어법 단계에 정의된 작용역이다.다시 말하면 어법 작용역은 당신이 코드를 쓸 때 변수와 블록 작용역을 어디에 쓰느냐에 따라 결정되기 때문에 어법 분석기가 코드를 처리할 때 작용역은 변하지 않는다.
  • eval:eval() 함수는 문자열을 매개 변수로 받아들이고 그 내용을 쓸 때 프로그램에 존재하는 이 위치에 있는 코드로 간주합니다.
    function foo(str, a){
      eval(str);
      console.log(a,b)
    }
    var b = 2;
    foo("var b = 3;", 1)
    //            b,             
    
  • with: with는 보통 같은 대상의 여러 속성을 중복 인용하는 더 빠른 방법
    eg:var obj = {
              a:1,
              b:2
              }
       obj.a = 2;
       obj.b = 3;
       :
      with(obj){
          a:2;
          b:33;
      }
    //           
    
    으로 간주된다. with는 한 속성이 없거나 여러 속성이 있는 대상을 완전히 격리된 어법 작용역으로 처리할 수 있기 때문에 이 대상의 속성도 이 작용역에 정의된 어법 표식자로 처리된다.그러나 이 블록 내부의 정상적인 var 성명은 이 블록의 작용역에 제한되지 않고 with가 있는 함수 작용역에 추가되기 때문에 새로운 문제가 발생하여 변수가 유출될 수 있습니다.
  • 함수 작용역
  • 에서 함수 작용역의 의미는 이 함수에 속하는 모든 변수를 전체 함수의 범위 내에서 사용하고 복용할 수 있다는 것을 의미한다(또는 끼워 넣은 작용역에서도 사용할 수 있다).
  • 의 이용: 임의의 코드 세그먼트 외부에 포장 함수를 추가하면 내부의 변수와 함수를'숨김'으로 정의할 수 있고 외부 작용역은 포장 함수 내부의 어떤 내용도 접근할 수 없다.
  • (function foo(){...}), 함수 표현식으로서foo는...대표하는 위치에서 방문되면 외부 작용역은 안 되고 장점은 외부 작용역을 오염시키지 않는다는 것이다
  • 진급 - - - - 익명 함수 인출(리셋 함수로), 장점이 뚜렷하고 외부 작용 영역을 오염시키지 않음
  • 함수 표현식(Immediately Invoked Function Expression, IIFE)을 즉시 실행합니다. 함수는 한 쌍() 내부에 포함되어 있기 때문에 하나의 표현식이 됩니다. 마지막에 다른 쌍()을 추가하면 이 함수를 즉시 실행할 수 있습니다.물론 함수명은 필수적이지 않다
  • (function foo(){
      ...
    })()
    
  • IIFE 진급용법: 그것들을 함수로 호출하고 매개 변수를 전달한다
  • var a = 2;
    (function IIFE(global){
        var a = 3;
        console.log(a);
        console.log(global.a);
    })(window);
    console.log(a);
    
    윈도우 대상의 인용을 전달하지만 형삼을 글로벌이라고 명명하기 때문에 코드 스타일에서 전역 대상에 대한 인용은'전역'이 없는 변수를 인용하는 것보다 더욱 뚜렷하다.
  • 블록 작용역,javascript는 블록 작용역이 없다. var로 변수를 성명하기만 하면 최종적으로 외부 작용역에 속한다. 예를 들어if문장 블록에 성명된 변수, (함수는 당연히 다른 것이다)
  • for(var i  =0; i<10; i++){
      ...
    }//i         
    
  • 생각: 왜 for순환 내부에서만 사용하는 변수 i를 전체 함수 작용역에 오염시킵니까?
  • with는 블록 작용역의 한 예이다!!!대상에서 with를 사용하여 만든 역할 영역은 외부 역할 영역이 아닌 with 성명에서만 유효합니다.
  • try/catch,try/catch의catch분구는 블록 작용역을 생성하는데 그 중 성명된 변수는catch 내부에서만 유효합니다
  • tyr{
      undefined();//                 
    }
    cathc(err){
      console.log(err)//    
    }
    console.log(err);//ReferenceError:err not found
    
  • let,let 키워드는 변수를 존재하는 임의의 역할 영역에 귀속시킬 수 있다. 즉,let이 성명한 변수 에 블록 역할 영역을 만들면if에서let로 성명한 변수가 전체 역할 영역을 오염시키지 않는다. 그러면 어떻게 블록을 만듭니까? 면 돼요.
  • if(foo){
      {
          let bar = foo * 2;
          bar = something(bar);
          console.log(bar)
      }
    }//             ,        ,              {...}  let          
    
    let , let , let
  • const도 블록 작용역 변수를 만들 수 있지만 그 값은 고정적(상량)

  • 승급
    a = 2;
    var a;
    console.log(a);//  2
    *=================*
    console.log(a); //  undefined
    var a = 2;
    
  • 성명만 상승하고 부수값이나 다른 운행 논리는 제자리에 남는다.함수 성명은 향상되지만
  • foo();
    var foo = function(){
    ...
    }//  ,TypeError
    
  • 함수 우선, 함수 성명과 변수 성명은 모두 향상되지만 함수가 먼저 향상된 다음에 변수가 된다. 이후에 성명한 것은 먼저 성명한 것을 덮어쓴다. 예를 들어 하나의 함수는foo이고 하나의 변수는foo이다. 그러면 변수가 우선일 것이다.

  • 작용역 폐쇄
  • 클로즈업의 일차 이해
  • function foo(){
      var a = 2;
      function bar(){
          console.log(a);
      }
      return bar;
    }
    var baz = foo();
    baz();//2--   !!!
    

    함수bar()는foo()의 내부 작용역에 접근한 다음bar() 함수 자체를 하나의 값 형식으로 전달하고foo()가 실행되면 그 반환값은 변수baz에 부여하고baz()를 호출할 수 있으며 실제로는 서로 다른 식별자를 통해 내부 함수bar()를 호출할 뿐이다. bar() 。foo()가 실행된 후에 보통foo()의 전체 내부 작용역을 소각하지만 클로즈업은 소각을 막을 수 있다. 즉foo()의 내부 작용역이 아직 있고 bar() 자체가 인용하고 있는데 이 인용은 클로즈업이다.
  • 본질적으로 언제 어디서든 함수를 1급의 값 유형으로 여기저기에 전달하면 (함수를 매개 변수로 다른 함수에 전달하는 것이다. 예를 들어 리셋 함수, 타이머, 이벤트 감청기) 이 함수에 패킷이 적용되는 것을 볼 수 있다.
  • 신기한 코드 - - - - 패키지 폐쇄에 대한 2차 이해
  • for(var i=1; i<=5; i++){
      setTimeout(function timer(){
          console.log(i);
      }, i*1000);
    }
    

    출력의 결과는 다섯 개의 6이고 주파수는 1초이다. 왜 그런가???
    for(var i=1; i<=5; i++){
              (function(j){
                  setTimeout(function timer() {
                      console.log(j);
                  },j*1000);
              })(i);
          }
    

    출력의 결과는 매초에 한 개의 숫자를 출력하는데 각각 1, 2, 3, 4, 5이다. 이것은 또 왜???

    좋은 웹페이지 즐겨찾기