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 중국어 웹사이트의 기타 관련 기사를 참조하세요!