[javascript] 자바 스크립트 함수 최고의 뱅! 통사론

나는 지금 몇 가지 라이브러리 에서이 구문을 보았으며 이점이 무엇인지 궁금합니다. (폐쇄에 대해 잘 알고 있으며 코드가 수행하는 작업을 잘 알고 있지만 구문상의 차이점에 대해서만 걱정하고 있습니다)

!function(){
  // do stuff
}();

보다 일반적인 대안으로

(function(){
  // do stuff
})();

익명 함수 자체 호출

몇 가지 궁금합니다. 우선, 가장 좋은 예가 실제로 작동하는 것은 무엇입니까? 이 문장이 구문 적으로 정확하도록하기 위해 왜 강타가 필요한가? 나는 또한 그 +효과가 있다고 들었고 대신 다른 사람들도 확신합니다.!

둘째, 장점은 무엇입니까? 내가 말할 수있는 것은 그것이 단일 캐릭터를 절약한다는 것입니다. 그러나 그것이 수많은 입양자를 유치하는 것이 큰 이점이라고 상상할 수 없습니다. 내가 놓친 다른 이점이 있습니까?

내가 볼 수있는 유일한 다른 차이점은 자체 호출 함수의 반환 값이지만 두 예제 모두 클로저를 만드는 데만 사용되므로 함수의 반환 값에 대해서는 신경 쓰지 않습니다. 누군가 왜 첫 번째 구문을 사용할 수 있는지 말해 줄 수 있습니까?



답변

이상적으로는이 모든 것을 다음과 같이 간단하게 수행 할 수 있어야합니다.

function(){
  // do stuff
}(); 

이것은 익명 함수를 선언하고 실행하는 것을 의미합니다. 그러나 JS 문법의 특성으로 인해 작동하지 않습니다.

이것을 달성하는 가장 짧은 형태는 UnaryExpression (그리고 CallExpression)과 같은 표현식을 사용하는 것입니다.

!function(){
  // do stuff
}(); 

또는 재미를 위해 :

-function(){
  // do stuff
}(); 

또는:

+function(){
  // do stuff
}(); 

또는:

~function(){
  // do stuff
  return 0;
}( );


답변

Javascript에서으로 시작하는 줄 function은 함수 명령문 으로 예상되며 다음과 같이 보입니다.

function doSomething() {
}

다음과 같은 자체 호출 기능

function(){
  // do stuff
}();

해당 형식에 맞지 않으며 함수 이름이 없으므로 첫 번째 여는 paren에서 구문 오류가 발생하므로 대괄호는 익명 함수 expression을 나타내는 데 사용됩니다 .

(function(){
  // do stuff
})();

그러나 (함수 문과 달리) 식을 만드는 것은 무엇이든 할 것입니다. ! . 이것은 인터프리터에게 이것이 함수 문장이 아니라고 말하고 있습니다. 그 이외의 연산자 우선 순위는 부정 전에 함수가 호출되도록 지시합니다.

나는이 관습을 알지 못했지만 그것이 일반적이되면 가독성에 기여할 수있다. 내가 의미하는 바는 !function큰 코드 블록의 상단에서를 읽는 사람 은 우리가 볼 때 이미 똑같이 기대하는 방식으로 자체 호출을 기대한다는 것 (function입니다. 그 성가신 괄호를 잃어 버릴 것입니다. 속도 나 캐릭터 수의 절감과는 반대로 이것이 바로 그 이유라고 생각합니다.


답변

이미 언급 된 것 외에도! 세미콜론없이 자바 스크립트를 작성하는 경우 유용합니다.

var i = 1
!function(){
  console.log('ham')
}()

i = 2
(function(){
  console.log('cheese')
})()

첫 번째 예제는 예상대로 ‘ham’을 출력하지만 두 번째 괄호로 인해 i = 2 문이 종료되지 않기 때문에 두 번째 오류가 발생합니다.

또한 연결된 자바 스크립트 파일에서 앞의 코드에 세미콜론이 누락 되어도 걱정할 필요가 없습니다. 따라서 일반적인; (function () {}) (); 자신의 휴식을 취하기 위해.

내 답변이 늦다는 것을 알고 있지만 아직 언급되지 않았다고 생각합니다.)


답변

우선 jsPerf는 !(UnaryExpression)을 사용하는 것이 일반적으로 더 빠르다 는 것을 보여줍니다 . 때때로 그들은 평등하게 나오지만, 그렇지 않을 때, 나는 다른 사람보다 뱅킹되지 않은 하나의 승리를 아직 많이 보지 못했습니다 : http://jsperf.com/bang-function

이것은 가장 오래된 (예 :.) Chrome 버전 8의 최신 Ubuntu에서 테스트되었으므로 결과는 다를 수 있습니다.

편집 : 어떻 delete습니까?

delete function() {
   alert("Hi!");
}();

또는 void?

void function() {
   alert("Hi!");
}();


답변

여기 에서 볼 수 있듯이 자바 스크립트에서 자체 호출 된 메소드를 수행하는 가장 좋은 방법은 다음을 사용하는 것입니다.

(function(){}()); -> 76,827,475 ops/sec

!function(){}();  -> 69,699,155 ops/sec

(function(){})(); -> 69,564,370 ops/sec


답변

따라서 부정 “!” +,-, ~, delete, void와 같은 다른 모든 단항 연산자는 요약하면 다음과 같습니다.

!function(){
  alert("Hi!");
}(); 

또는

void function(){
  alert("Hi!");
}();

또는

delete function(){
  alert("Hi!");
}();

그리고 재미를 위해 바이너리 연산자 를 사용하는 몇 가지 경우가 더 있습니다. 🙂

1 > function() {
   alert("Hi!");
}();

또는

1 * function() {
   alert("Hi!");
}();

또는

1 >>> function() {
   alert("Hi!");
}();

또는

1 == function() {
   alert("Hi!");
}();

다른 사람을 위해 삼항을 떠나기 🙂


답변