(function () {} ()) 와function () {} 실례의 작용역 분석 (안에 문제가 많습니다...)

7055 단어 function
오늘 단톡방에서 한 문제를 보고 나는 한참 동안 고민했다.다음은 저의 분석입니다. 안에 아직도 많은 문제가 있는 것 같습니다. 작용역에 관해서는 잘 이해하지 못합니다. 문제를 보고 가장 먼저 저에게 피드백을 해 주십시오. 정말 참을 수 없는 부분을 보고 몇 마디 해도 괜찮습니다. 감사합니다.
문제 보기:
1. 대상 글꼴 중 fn1 함수는 즉시 실행되는 함수 표현식입니다.
            $(function(){
                var number = 2;
                var obj = {
                    number: 4,
                    fn1: (function(){
                        this.number *= 2;
                        number = number*2;
                        var number = 3;
                        return function(){
                            this.number *= 2;
                            number *= 3;
                            alert(number);
                        }
                    })()
                };
                var f = obj.fn1;
                alert(number); /* 2 */
                f(); /* 9 */
                obj.fn1(); /* 27 */ /*  ,number  */
                alert(window.number); /* NaN */ 
          alert(obj.number);
/* 8 */ }) </script>

출력 2, 9, 27, NaN, 8.
분석:
우선 fn1이라는 함수를 보면 즉시 실행되는 함수 표현식이기 때문에 var f=obj.fn1 때 fn1 함수 아래에 접근했습니다.지금 실행 함수 표현식 fn1에서this.number는 NaN입니다. 여기에서 자신의 속성과 방법을 방문할 수 없기 때문입니다.number =number*2는 NaN입니다. number는 undefined이기 때문에 미리 해석한 바에 따라 varnumber를 정의합니다.number= number *2; number = 3.다음은 varnumber=3을 정의했습니다. 이 작용역과 내부 작용역에서number는 잠시 3입니다.return function () {}에서 외부에서 즉시 실행되는 함수 표현식 때문에this.number는 유효합니다(구해...),number =number *3은 외부 작용역number 값에 따라 결정됩니다.
  alert(number);출력 2, 사전 해석 때문에.
  f();출력 9, 외부 number가 3이기 때문에 3*3 = 9.
  obj.fn1();출력 27, 즉각 실행 함수이기 때문에 모든 변수 값을 저장하는 작용이 있습니다.number 값은 9이고 9*3=27을 사용합니다.
  alert(window.number);NaN을 출력합니다. 불러온 후에 출력하기 때문에 윈도우를 출력합니다.number는 유효합니다. 국부 작용 영역 내에서만 가능합니다.
  alert(obj.number);출력 8, fn1에서this.number 실효,return function () 중this.number가 유용하기 때문에return 함수의this만 실행합니다.number *= 2.
2. 대상 글꼴 중 fn1 함수는 즉시 실행되는 함수 표현식이 아닙니다.
            $(function(){
                var number = 2;
                var obj = {
                    number: 4,
                    fn1: function(){
                        this.number *= 2;
                        number = number*2;
                        var number = 3;
                        return function(){
                            this.number *= 2;
                            number *= 3;
                            alert(number);
                        }
                    }
                };
                var f = obj.fn1();
                alert(number); /* 2 */
                f(); /* 9 */
                obj.fn1()(); /* 9 */ /*  , , ,  */
 alert(window.number); /* NaN */
                alert(obj.number); /* 16 */

            })

출력 2, 9, 9, NaN, 16.
분석:
우선 fn1이라는 함수를 보면 함수 인용 (호출해야 실행) 이기 때문에 var f=obj.fn1 () (뒤에 괄호를 연결해야 할 때) fn1 함수 아래에 접근했습니다.지금 실행 함수 표현식 fn1에서this.number는 유효합니다. 일반 함수에서 자신의 속성과 방법에 접근할 수 있습니다.number =number*2는 NaN입니다. number는 undefined이기 때문에 미리 해석한 바에 따라 varnumber를 정의합니다.number= number *2; number = 3.다음은 var number = 3을 정의했습니다.return function () {}에서 외부 함수는 일반 함수이기 때문에this.number는 무효입니다 (구해...),number =number *3은 외부 작용역number 값에 따라 결정됩니다.
  alert(number);출력 2, 사전 해석 때문에.
  f();출력 9, 외부 number가 3이기 때문에 3*3 = 9.
  obj.fn1()();출력 9, f () 와 같은 작용역에 없기 때문에, fn1 () 초기화number = 3을 호출하고, 뒤에 obj를 출력합니다.fn1 () () 또는 9입니다.
  alert(window.number);NaN을 출력합니다. 불러온 후에 출력하기 때문에 윈도우를 출력합니다.number는 유효합니다. 국부 작용 영역 내에서만 가능합니다.
  alert(obj.number);출력 16, fn1에서this.number 유용,return function () 중this.number가 효력을 잃었기 때문에 fn1 함수의this만 실행합니다.number *= 2.

좋은 웹페이지 즐겨찾기