최근에 json2.js 의 현재 버전을 프로젝트에있는 버전과 비교 했는데 함수 표현식이 생성되고 자체 실행되는 방식에 차이가 있음을 발견했습니다.
익명 함수를 괄호로 묶은 다음 실행하는 데 사용되는 코드,
(function () {
// code here
})();
하지만 이제는 자동 실행 함수를 괄호로 묶습니다.
(function () {
// code here
}());
의 허용 대답 CMS에 의해 주석이 자바 스크립트의 캡슐화 된 익명 함수 구문을 설명 하는 것이 “모두 : (function(){})();
와이 (function(){}());
. 유효은”
차이점이 무엇인지 궁금합니다. 전자가 전역 익명 함수를 떠나 메모리를 차지합니까? 괄호는 어디에 있어야합니까?
답변
거의 동일합니다.
첫 번째는 함수를 괄호로 묶어 유효한 표현식으로 만들고 호출합니다. 식의 결과가 정의되지 않았습니다.
두 번째는 함수를 실행하고 자동 호출을 괄호로 묶어 유효한 표현식이됩니다. 또한 정의되지 않은 것으로 평가됩니다.
표현의 결과가 같기 때문에 “올바른”방법이 없다고 생각합니다.
> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
답변
그 경우는 중요하지 않습니다. 첫 번째 정의에서는 함수로 해석되는 표현식을 호출하고 두 번째 예제에서는 함수를 정의하고 즉시 호출합니다. 첫 번째 예제의 함수 표현식은 함수 정의 일 뿐이므로 비슷합니다.
함수로 확인되는 표현식을 호출하는 데 분명히 유용한 다른 경우가 있습니다.
(foo || bar)()
답변
구문 외에는 차이가 없습니다.
두 번째 방법에 대한 우려 사항 :
치다:
(function namedfunc () { ... }())
namedfunc
이름을 제공 했더라도 여전히 전역 범위에 포함되지 않습니다. 익명 함수도 마찬가지입니다. 해당 범위에서 가져 오는 유일한 방법은 괄호 안의 변수에 할당하는 것입니다.
((namedfunc = function namedfunc () { ... })())
바깥 쪽 괄호는 필요하지 않습니다.
(namedfunc = function namedfunc () { ... })()
하지만 어쨌든 그 글로벌 선언을 원하지 않으 셨죠?
따라서 다음과 같이 요약됩니다.
(function namedfunc () { ... })()
그리고 당신은 그것을 더 줄일 수 있습니다 : 이름은 결코 사용되지 않기 때문에 불필요합니다 (당신의 함수가 재귀 적이 지 않는 한 .. 그리고 심지어 당신이를 사용할 수 있지 않는 한 arguments.callee
)
(function () { ... })()
그것이 제가 생각하는 방식입니다 (아직 ECMAScript 사양을 읽지 않았을 수도 있습니다). 도움이되기를 바랍니다.
답변
Douglas Crockford 가 IIFE 의 첫 번째 스타일을 좋아하지 않기 때문에 차이점이 존재합니다 ! (진심으로) 이 영상에서 보시다시피 !! .
추가 래핑 ()
{in both styles}이 존재하는 유일한 이유 는 Function Declaration 을 즉시 호출 할 수 없기 때문에 코드의 해당 섹션을 Function Expression으로 만드는 것입니다 . 일부 스크립트 / 바로 사용 작게하다는-ERS , , & 대신 너무 괄호를. 이렇게 :+
!
-
~
+function() {
var foo = 'bar';
}();
!function() {
var foo = 'bar';
}();
-function() {
var foo = 'bar';
}();
~function() {
var foo = 'bar';
}();
그리고이 모든 것은 당신의 대안과 똑같습니다. 이러한 경우를 선택하는 것은 전적으로 본인이 결정하며 차이가 없습니다. { 1 바이트 더 큰 파일 을 ()
생성 하는 것 ;-)}