2009-07-13 4 views
-2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
     <title>test</title> 

    </head> 
    <body> 
     <script type="text/javascript" charset="utf-8"> 
      (function(){ 
       // this 
       var test=function(){ 
        //this 
        return function(){ 
         //this 
        }; 
       } 

       (function(){ 
        //this 
        var a={ 
         p1:function(){ 
          //this 
         } 
        }; 
       })(); 
      })(); 
     </script>  
    </body> 
</html> 
+5

주의 사항 범위 체인, 자바 스크립트는 광고보다 간단 할 수 있습니다 포함되어 있습니다. 이용 약관에 동의. 쿠폰은 캐나다에서는 유효하지 않습니다. – Greg

+2

일부 코드를 붙여 넣기 만해도 좋은 질문이 아닙니다. -1 – Boldewyn

답변

13

David Dorward는 JavaScript에 대해 이미 언급했습니다. Douglas Crockford의 Good Parts. 그 우수한 책의 섹션 4.3에서

:

함수를 호출하여 현재 기능은 새로운 기능 제어 파라미터를 전달하는 실행을 중지. 선언 된 매개 변수 외에 모든 함수 에는 this 및 인수라는 두 개의 추가 매개 변수가 수신됩니다. 이 파라미터 은 객체 지향 프로그래밍에서 매우 중요하며 그 값은 호출 패턴에 의해 결정되는 입니다. JavaScript에는 의 호출 패턴이 있습니다. 메서드 호출은 패턴이고, 함수 호출은 패턴이며, 생성자 호출은 패턴이며, 적용 호출은 패턴입니다. 패턴은 보너스 매개 변수가 으로 초기화되는 방식이 다릅니다.

메소드 호출 패턴 : 함수는 객체의 속성으로서 저장 될 때, 우리는 호출

크록 포드는 '이'이 패턴의 각각에, 다음과 같이 결합 설명합니다 계속 그것은 방법. 메서드가 호출 될 때이 메서드는 해당 개체에 바인딩됩니다.

함수 호출 패턴 :이 패턴으로 함수를 호출하면이 함수는 전역 객체에 바인딩됩니다. 이것은 언어의 디자인에서 실수였습니다.

생성자 호출 패턴 : 새 접두사로 함수를 호출하면 함수의 프로토 타입 멤버 값에 대한 숨겨진 링크가있는 새 객체가 만들어지고이 객체가 새 객체에 바인딩됩니다. .

Apply Invocation Pattern : apply 메소드를 사용하면 함수를 호출하는 데 사용할 인수 배열을 만들 수 있습니다. 그것은 또한 우리가 이것의 가치를 선택할 수있게 해줍니다. apply 메소드는 두 개의 매개 변수를 취합니다. 첫 번째는이 값에 바인딩되어야하는 값입니다. 두 번째 매개 변수의 배열입니다.

+0

"호출"호출 패턴 ('fn.call (context, arg1, arg2, ... argn)')에 관한 내용이 없습니까? –

+1

@ gion_13,'this'의 관점에서 보면 "Apply Invocation Pattern"과 동등합니다. (관련 답변 참조) (http://stackoverflow.com/a/1986909/562906) – sinelaw

1

는 글로벌 this 줄곧 다시 바닥 함수의 this에서 이동 범위 체인 점에서 주석

되. 그것은

(function(){ 
    //this 
    var a={ 
    p1:function() 
다음

야후 니콜라스 Zakas에 의해 좋은 프리젠 테이션에 있습니다 그것은

(function(){ 
    // this 
    var test=function(){ 

위의 this 위 다음

p1:function(){ 
     //this 
    } 

은이의이 예

it at http://www.youtube.com/watch?v=mHtdZgou0qU

4

의 의미 this의 의미는 포함하는 기능이 이라고하는 방법이 아니라 어떻게 이라고 지었는지는입니다.

JavaScript: The Good Parts에서 작동하는 방식에 대한 훌륭한 설명이 있습니다.

짧은 버전은 함수 (m)를 객체 (o)의 메소드로 호출 할 때 thiso 인 짧은 버전입니다.

var o = { 
    m: function() { 
     return this; 
    } 
} 

var foo = { 
    bar: o.m; 
} 

o === o.m(); 
foo === foo.bar(); 
0

범위와이 포인터 할당을 이해하려면 자바 스크립트 클로저를 보는 것이 가장 좋습니다. "this"는 객체 지향 프로그래밍 이전에도 등장했지만 분명히 필수적입니다.

http://jibbering.com/faq/notes/closures/

이 식별자 해상도 범위 체인의 역할에 크게 의존하고 있으므로 개체에 대한 속성 이름의 해상도에

.

클로저에 대한 간단한 설명은 ECMAScript가 내부에서 허용하는 것입니다. ; 함수 정의 및 다른 함수의 함수 기호 안에 인 함수 표현식이 있습니다. 처음에 가변 인스턴스 동안 undefined 값 할당된다 선언 로컬 변수에 대응하는 변수 객체 생성


특성은 로컬 변수의 실제 초기화가 평가 될 때까지 일어나지 않는다 함수 본문 코드를 실행하는 동안 해당하는 할당 표현식.

활성화 객체 함수 로컬 변수 대응이라는 특성 인자 속성, 변수 객체와 상기 식별자 인자처럼 처리 될 수 있도록 동일한 개체하다는 사실 변수 로컬 변수였습니다.

마지막으로 this 키워드와 함께 사용할 값이 지정됩니다. 할당 된 값이 객체를 참조하는 경우 속성 접근자는 접두어로 해당 객체의 this 키워드 참조 속성을 사용합니다. 값이 (내부적으로) 할당 된 경우 this 키워드는 을 전역 개체로 나타냅니다.

전역 실행 컨텍스트가 과 약간 다른 처리를하게되므로 인수가 없으므로 정의 된 활성화 개체를 참조 할 필요가 없습니다. 전역 실행 컨텍스트에는 범위가 필요하며 해당 범위 체인은 정확히 하나의 개체 인 글로벌 개체로 구성됩니다.전역 실행 컨텍스트는 변수 인스턴스화를 거치며, 내부 함수는 정상적인 최상위 함수 선언을 사용하여 많은 자바 스크립트 코드를 구성합니다. 전역 개체가 Variable 개체로 사용되므로 전역 적으로 선언 된 함수가 전역 개체의 속성이됩니다. 세계적으로 그렇듯이 선언 된 변수.

또한 전역 실행 컨텍스트는이 개체에 대해 글로벌 개체에 대한 참조를 사용합니다. http://jibbering.com/faq/notes/closures/ 장 의례 : 식별자 해상도, 실행 컨텍스트 및