익명 JavaScript 함수 자동 실행을위한 괄호 위치?
최근에 json2.js 의 현재 버전을 내 프로젝트에있는 버전과 비교 했는데 함수 표현식이 생성되고 자체 실행되는 방식에 차이가 있음을 발견했습니다.
익명 함수를 괄호로 묶은 다음 실행하는 데 사용되는 코드,
(function () {
// code here
})();
하지만 이제는 자동 실행 함수를 괄호로 묶습니다.
(function () {
// code here
}());
Explain JavaScript의 캡슐화 된 익명 함수 구문에 대한 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 바이트 더 큰 파일 을 ()
생성 하는 것 ;-)}
'programing tip' 카테고리의 다른 글
Gradle에서 사용하지 않는 종속성을 찾고 제거하는 방법 (0) | 2020.08.14 |
---|---|
Webpack 4-최소화를 구성하는 방법? (0) | 2020.08.14 |
WISC (스택)는 무엇을 의미합니까? (0) | 2020.08.14 |
의사 TTY 할당이란 무엇입니까? (0) | 2020.08.14 |
명시 적으로 지정하거나 오버로드를 사용하지 않고 서명에 선택적 인수가있는 메서드를 어떻게 Moq합니까? (0) | 2020.08.14 |