2010-12-28 2 views
31

는 간단한 자바 스크립트 출력 (기본적으로) 다음과 같습니다왜 (커피 스크립트에 추가) 자바 스크립트 함수 래퍼 사용 ".call (이)는"

(function() { 
    var a; 
    a = 1; 
}).call(this); 

.call (this)은 무엇이며 어떻게 추가할까요?

+0

이 js를 생성하는 코드를 표시 할 수도 있습니까? –

+1

내 생각에 모든 변수에 기본적으로 전역 함수 (전역 변수가 아님)를 만들고 'this'를 통해 상위 범위에 액세스 할 수있는 가장 간단한 방법입니다. – miensol

+2

JS 네임 스페이스에 대한 훌륭한 기사입니다. http : //javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/ –

답변

15

함수를 생성하고 부모 함수/개체 범위를 사용하여 자체를 호출합니다.

.call과 .apply는 서로 다른 함수 호출 방법입니다. 기본적으로 자신의 범위 내에서 a = 1을 설정하는 것 외에는 아무것도 수행하지 않는 함수를 작성했습니다.

자바 스크립트에서는 모든 함수가 객체라는 것을 알아야하며 this은 현재 객체/함수를 참조합니다. .call(this)을 사용하면 함수 내에서 this을 대체하고이를 호출 컨텍스트의 값으로 바꿉니다.

33

컴파일 된 CoffeeScript에 변수 이름에 대한 자체 범위가 있는지 확인하는 방법입니다. 이것은 효율성과 단순성면에서 이점을 제공합니다 (생성 된 자바 스크립트가 다른 코드에서 사용되는 변수를 밟지 않는다는 것을 알고 있습니다). CoffeeScript 컴파일러에 대한 --bare (또는 -b) 옵션을 사용하여이 기능을 비활성화 할 수 있습니다.

call(this) 이유는 기능이 정상적으로 주위의 상황에서 자신의 this 객체를 상속하지 않기 때문에 단지는 커피 스크립트는이 배치됩니다 범위와 같은 this이 있는지 확인하는 것입니다.

+5

에서 좋은 답변을 참조하십시오. 이는 자체 간부 기능과 어떻게 다른가요? 좋아요 : (function() { /* Code */ })(); – qwertymk

+8

자기 실행 기능은 브라우저 컨텍스트에서로드되지 않을 때'this'라는 개념을 잃습니다. 일부 CommonJS 플랫폼은 특정 'this'로로드 된 파일을 평가합니다. – jashkenas

+2

나는 가변 범위의 이유를 완전히 이해하고 있지만 효율성 이점이 무엇인지 알고 싶다. 컴파일러 또는 생성 된 JavaScript의 효율성을 언급하고 있습니까? –