> 웹 프론트엔드 > JS 튜토리얼 > JavaScript 함수 호출 및 클로저의 괄호는 항상 구문 설탕에 불과합니까?

JavaScript 함수 호출 및 클로저의 괄호는 항상 구문 설탕에 불과합니까?

DDD
풀어 주다: 2024-11-02 20:33:31
원래의
536명이 탐색했습니다.

Are Parentheses in JavaScript Function Calls and Closures Always Just Syntactic Sugar?

JavaScript에서 표현식 클로저와 함수 호출이 동일합니까?

JavaScript에서 다음 코드 조각은 동일한 출력을 생성하는 것으로 나타납니다.

<code class="js">(function() {
    bar = 'bar';
    alert('foo');
})();

(function() {
    bar = 'bar';
    alert('foo');
}());</code>
로그인 후 복사

두 블록 모두 경고('foo') 문을 실행하고 클로저 외부에서 액세스할 수 있는 변수 bar를 선언합니다. 유일한 명백한 차이점은 )()} 대 }());를 사용하는 클로저 구문에 있습니다.

이러한 구성은 기능적으로 동일합니까?

답변 : 예, 동일합니다.

추가 고려 사항:

추가 괄호가 도입되면 동작이 변경됩니다. 다음 시나리오를 고려하십시오.

시나리오 1:

<code class="js">new (function() {
    this.prop = 4;
})().prop;</code>
로그인 후 복사

이 표현식은 함수 클래스의 새 인스턴스를 생성하고 새 인스턴스의 prop 속성에 액세스하여 다음을 반환합니다. 값 4. 이는 다음과 같습니다.

<code class="js">function MyClass() {
    this.prop = 4;
}

new MyClass().prop;</code>
로그인 후 복사

시나리오 2:

<code class="js">new ( function() {
    return { Class: function() { } }; 
}() ).Class;</code>
로그인 후 복사

이 경우 새 표현식은 함수 클래스의 Class 속성을 인스턴스화합니다. 반환 값. 함수 호출 주위의 괄호는 함수가 즉시 호출되어야 함을 나타내는 매우 중요합니다.

이는 다음과 같습니다.

<code class="js">var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
// Or,
new namespace.Class;</code>
로그인 후 복사

getNamespace() 호출에서 괄호가 제거된 경우 , 표현식은 getNamespace 클래스를 인스턴스화하고 새 인스턴스의 Class 속성에 액세스합니다.

위 내용은 JavaScript 함수 호출 및 클로저의 괄호는 항상 구문 설탕에 불과합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿