함수 표현식 앞에 JavaScript 더하기 부호


866

나는 즉시 호출 된 함수에 대한 정보를 찾고 있었고 어딘가 에서이 표기법을 발견했습니다.

+function(){console.log("Something.")}()

누군가 +가 기능 앞에 있는 표시가 무엇을 의미 하는지 설명 할 수 있습니까 ?


17
벤 독일어는 모두 여기에 그것을 설명 : mths.be/iife
마티아스 Bynens

답변:


1320

구문 분석기가 다음에 오는 부분을 +표현식으로 취급 하도록합니다. 일반적으로 다음과 같이 즉시 호출되는 함수에 사용됩니다.

+function() { console.log("Foo!"); }();

포함하지 않는 +파서가이 단어 (표현 또는 여러 비 표현 문이 될 수 있습니다) 성명 기대하고 있어요 상태에있는 경우가, function함수의 시작 부분과 같은 모양 선언 이 아닌 함수 표현 그렇게하고을을 ()을 다음 (위 줄의 끝에있는 것)은 구문 오류 일 것입니다 (예에서 이름이없는 것처럼). 을 사용 하면 +함수 표현식이됩니다. 즉, 이름이 선택적이고 함수에 대한 참조가 생성되어 호출 될 수 있으므로 괄호가 유효합니다.

+옵션 중 하나 일뿐입니다. 그것은 또한 할 수있다 -, !, ~, 또는 다른 모든 단항 연산자에 대해. 또는 괄호를 사용할 수 있습니다 (구문 적으로 더 일반적이지만 정확하지는 않습니다).

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());


159
paren-wrapping이 우수한 표기법이라고 말할 수 있습니까? 나는 표현을 포함하는 봉사에 매우 익숙합니다. 이 js의 이상한 특징을 아직 모른다면이 경우 +가 무엇을하고 있는지 전혀 명확하지 않습니다.
Chris

1
참고 : 두 가지 옵션 중에서 jsLint 가 두 번째 옵션을 선호합니다. jsHint 가 덜 까다 롭다고 생각 합니다.
비트 뿌리 – 비트 뿌리

43
"plus"표기법을 사용하는 일반적으로 사용되는 라이브러리 중 하나는 Bootstrap입니다 (이 스레드를 읽는 방식입니다).
Ville

부트 스트랩은 BTW,이 일을한다 : maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
xanderiel

94

@TJCrowder의 답변에 대한 자회사 +는 일반적 으로이 SO 답변이 설명하는 것처럼 값의 숫자 캐스팅을 강제하는 데 사용됩니다 . 이 경우이를 '단일 더하기 연산자'(구글링 용이성)라고합니다.

var num = +variant;

따라서 함수 앞에서 함수의 결과를 숫자로 해석하도록 할 수 있습니다. 나는 그것이 아직 의심 스럽지만 이론적으로 JIT는 함수를 숫자 전용 함수 등으로 컴파일하는 데 사용할 수 있습니다. 그러나 더 큰 표현식에 사용될 때 단항 더하기가 연결되는 것을 방지하려면 괄호가 필요합니다.

blah + (+(function(){ var scope; return "4"; })());

3
이것이 어떻게 37 개의 공감대를 얻었습니까? (+function() { ... })()표기 (이 질문에 대답하지 않는다는 사실에서 떨어져) 오류없이 실행되지 않을 수 있습니다.
whitequark

6
@whitequark : 함수 + 호출 주위에 한 쌍의 중괄호가 없습니다. 숫자 캐스팅 설명으로 인해 upvotes가 더 많은 것으로 의심됩니다.
Phil H

10
알았어요.
whitequark

2
@Christoph 나는 그 괄호를 거기에 두는 경향이 있습니다. 사실, 나는 그들이 빠졌을 때 추가하기까지 갈 것입니다. 공백을 제거하여 코드가 최소화 될 때 발생하는 문제를 훨씬 더 명확하게하고 3++function..., 동일하지 않은 공백을 제거합니다 .
Benjam

3
더 반영하지만, +function...그 자체로는 불필요합니다. blah + function( ){ ... }( );랩핑 브래킷의 필요성을 무효화하는 동일한 결과를 얻을 수 있습니다 .
Benjam

60

따라서 짧은 대답은 함수 결과를 여러 가지 방식으로 사용하여 구문 오류를 방지한다는 것입니다.

void연산자 를 사용하여 반환 값에 관심이 없다고 엔진에 지시 할 수도 있습니다 .

void function() { console.log("Foo!"); }();

물론 전체를 중괄호로 묶는 것도 그 목적에 도움이됩니다.


45
무효 또는 괄호가 엄청나게 바람직합니다. 그들은 WTF가 없습니다. +를 사용하는 것은 똑똑하지 않은 영리함의 일종입니다.
Peter Wone

2
좋은 지적입니다. 운영자 중 하나를 사용하면 현재 업계 표준과 반대되는 것으로 보입니다. 아마도 "멋진 아이"개발자 그렇지 않으면 난 아직도 오히려 무효 또는 ()보다 뭔가를 사용하는 점 보이지 않아요, 그것을 선택할 것
dudewad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.