2013-03-06 7 views
1

JavaScript Enlightenment (이 링크는 사전 게시 된 버전 (85 페이지)에 있지만 발행 된 버전 (6.3 장)이 있으며 같은 것을 말합니다.) 어떤 내부 함수도 this을 전역 개체 (window)는 ECMA-3에서 사용되지만 ECMA-5에서는 수정됩니다.JavaScript에서는 독립 실행 형 내부 함수가 "this"를 원본 메서드가 호출 된 개체로 취급합니까?

http://jsfiddle.net/javascriptenlightenment/9GJhu/

var myObject = { 
    func1: function() { 
     console.log(this); // logs myObject 
     var func2 = function() { 
      console.log(this) // logs window, and will do so from this point on 
      var func3 = function() { 
       console.log(this); // logs window, as it’s the head object 
      }(); 
     }(); 
    } 
} 

myObject.func1(); 

는하지만 현재 크롬, 파이어 폭스 생각과 Node.js를 큰 정도 ECMA-5 구현해야한다, 그래서 위의 시도 :

이 코드는 다음과 같습니다 코드를 사용하여 여전히 func2func3 내부의 전역 개체를 인쇄합니다. 그런 다음 "use strict";func1에 추가했으며, 경우에 따라 func2func3도 추가했습니다. 코드 : http://jsfiddle.net/9GJhu/6/ 이제 Chrome 및 node.js에서 이 myObject 대신 undefined으로 인쇄됩니다. 따라서이 책에 따르면 this은 ECMA-5에서 myObject이되어야합니다. 위의 코드에서 잘못된 점은 무엇입니까?

답변

2

내가 틀릴 수도 있지만, 그 책이 의미하는 바를 어디서나 보지 못했습니다. ECMAScript 5.1 specification 10.4.3 입력 기능 코드

  1. 기능 코드가 엄격한 코드 경우에 따라
    는 thisArg에 ThisBinding을 설정합니다.
  2. 그렇지 않으면 thisArg가 null이거나 정의되지 않은 경우 ThisBinding을 전역 객체로 설정하십시오.
  3. 그렇지 않으면 Type (thisArg)이 Object가 아닌 경우 ThisBinding을 ToObject (thisArg)로 설정하십시오.
  4. 다른 사람은 this 바인딩을 thisArg로 설정합니다.
  5. localEnv를 NewDeclarativeEnvironment를 호출 한 결과로 놓고 F의 [Scope]] 내부 값을 인수로 전달하십시오.
  6. LexicalEnvironment를 localEnv로 설정하십시오.
  7. VariableEnvironment를 localEnv로 설정하십시오.
  8. 코드를 F의 [[코드]] 내부 속성 값으로 지정하십시오.
  9. 10.5에서 설명한대로 함수 코드 code 및 argumentsList를 사용하여 선언 바인딩 바인딩을 수행합니다.

에 따르면 (1), 당신의 func2func3 어떤 컨텍스트를 가지고 있지 않으며, 당신이 strict mode 당신의 상황이 undefined로 설정됩니다 지정된 때문이다. strict mode없이 (2)에 따라 thiswindow으로 설정됩니다.

1

'use'strict '지시문을 사용하면 기본적으로'this '키워드가 전역 객체를 참조하는 비 엄격 모드와 달리 기본적으로'this '키워드가'undefined '입니다. 컨텍스트를 명시 적으로 지정해야합니다.

사이드 노트에서 'use strict'를 한 번만 선언하면됩니다.

0

함수가 중첩되어 있다는 사실은 아무 의미도 없습니다.

var myObject = { 
    func1: function() { 
     console.log(this); // logs myObject 
    } 
} 
myObject.func1(); 

var func2 = function() { 
    console.log(this) // logs window, and will do so from this point on 
}(); 

var func3 = function() { 
    console.log(this); // logs window, as it’s the head object 
}(); 

http://jsfiddle.net/NYr3y/2/

var myObject = { 
    func1: function() { 
     "use strict"; 

     console.log(this); // logs myObject 
    } 
} 

myObject.func1(); 


var func2 = function() { 
    "use strict"; 

    console.log(this) // logs window, and will do so from this point on 

}(); 

var func3 = function() { 
    "use strict"; 

    console.log(this); // logs window, as it’s the head object 
}(); 

http://jsfiddle.net/4B84u/2/

그래서 다음 (방법으로) 컨텍스트로 호출되고 첫 번째 함수는 "이"입니다 : 그들은 또한 중첩되지 같은 방법으로 작업을 계속할 myObject.

다른 함수는 컨텍스트없이 (func2()처럼) 호출되며이 경우 ECMA-5는이를 통해 전역 개체 nether에 대한 명시 적 참조를 허용하지 않습니다.

대부분의 브라우저는 더 제한적이므로 역 호환이 가능하지 않으므로 기본적으로 ECMA-5가 적용되지 않습니다.