>  기사  >  웹 프론트엔드  >  \"(function () { } ) ( )\" 및 \"(function () { } ( ) )\"는 JavaScript에서 기능적으로 동일합니까?

\"(function () { } ) ( )\" 및 \"(function () { } ( ) )\"는 JavaScript에서 기능적으로 동일합니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-30 07:29:03681검색

Are

JavaScript의 함수 호출 구문: 기능적으로는 "(function ( ) { } ) ( )" 및 "(function ( ) { } ( ) )"입니다. 동일합니까?

질문:

다음 두 JavaScript 코드 블록을 고려하세요.

(function()
{
    bar = 'bar';
    alert('foo');
})();

alert(bar);
(function()
{
    bar = 'bar';
    alert('foo');
}());

alert(bar);

두 코드 블록 모두 경고를 실행합니다. ('foo'), 그 다음에는 Alert(bar)를 사용하여 각각 'foo'와 'bar'를 표시합니다. 둘 사이의 유일한 차이점은 함수 호출 구문입니다. 기능적으로 동일합니까?

답변:

예, 일반적으로 두 코드 블록은 기능적으로 동일합니다. 둘 다 새로운 함수를 정의하고 즉시 실행한 다음 전역 범위 내에서 bar 변수에 액세스합니다.

예외:

그러나 다음과 같은 극단적인 경우가 있습니다. 두 구문은 다르게 동작할 수 있습니다. 특히, 함수 앞이나 함수 내의 .something 뒤에 새 코드를 도입하면 더 이상 동일하게 동작하지 않습니다.

코드 1:

new (function() {
    this.prop = 4;
}) ().prop;

이 코드는 함수 클래스의 새 인스턴스를 생성하고 새 인스턴스의 prop 속성을 검색하여 4를 반환합니다. 이는 동일합니다. to:

function MyClass() {
    this.prop = 4;
}
new MyClass().prop;

코드 2:

new ( function() {
    return { Class: function() { } }; 
}() ).Class;

이 코드는 Class 속성에서 new를 호출합니다. 함수 호출에 대한 괄호는 바깥쪽 괄호 안에 있으므로 새 표현식을 트리거하지 않고 대신 정상적으로 함수를 호출하여 반환 값을 반환합니다. 새 표현식은 .Class까지 인스턴스화하고 이를 인스턴스화합니다.

var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;

getNamespace() 호출을 괄호로 묶지 않으면 이 코드는 (new getNamespace()).Class로 구문 분석되어 getNamespace 클래스를 인스턴스화하고 클래스 속성을 반환합니다. 새로운 인스턴스.

위 내용은 \"(function () { } ) ( )\" 및 \"(function () { } ( ) )\"는 JavaScript에서 기능적으로 동일합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.