2012-12-20 4 views
1

가능한 중복 :JS : A의 차이점은 무엇입니까? 폐쇄 및() 폐쇄?


What does the exclamation mark do before the function? 그래서 난 다시 가고 있었다 그리고 몇몇 다른뿐만 아니라 내 자신의 코드의 일부 찾고 자바 스크립트 코드와 나는 잠시 동안 다시 내가 시작했을 때 실현 자바 스크립트 라이브러리 작성하기 나는 다음과 같은 모양의 클로저를 사용했다.

(function(window, document, undefined) { 
    // code 
})(window, document); 

그러나 그때 나는 어떤 부트 스트라를 보았다. 나는 (내가 경우 제발 올바른) 잘못 아니에요 경우 배치,

! function (window, document, undefined) { 
    // code 
}(window, document); 

지금 : P 코드와 나는이 구문으로 변경 '!' 내 익명의 함수 바로 앞에 '()'으로 처리 된 다음 함수에 의해 반환 된 값이 정의되지 않았는지, null이 아니거나 비어 있는지 여부를 나타내는 부울 값을 반환합니다.

궁금한 점은 '()()'구문보다 '!()'구문을 사용하는 것의 차이점이 있습니까? 불평 할 특정 브라우저가 있습니까?

의견을 보내 주셔서 감사합니다. XD

+3

http://stackoverflow.com/questions/3755606/what-does-the-exclamation-mark-do-before-the-function을 참조하십시오. 이렇게하는 것이 기능 당 코드 크기에 여분의 바이트를 저장하는 것입니다. – Emily

+0

굉장 해요. 그래서 효율성을 높이기 위해 1 바이트를 절약하고 얼마나 많은 클로저를 사용하는지 등을 기준으로 확대 할 것입니다. – kd3v

+0

절약 바이트는 축소 및 gzip 압축과 비교할 때 상당히 중요합니다. –

답변

0

아무 것도 없지만 두 가지 방법으로 동일한 결과를 얻을 수 있습니다. ()은 약간 더 읽기 쉽습니다.

1

당신이 묻는 것은 IIFE (immediately invoked function expression)라고도하는 자체 호출 기능입니다. 종결과는 다른 것입니다. 클로저를 만들지 만 (사실, javascript의 모든 함수는 IIFE뿐만 아니라 클로저를 만듭니다.)

IIFE는 일반적으로 클로저를 설명하는 맥락에서 소개되기 때문에 두 가지 문제를 혼동시킬 수 있습니다. 그러나 그들은 서로 다른 점에 유의하십시오. 클로저는 개인적이고 공유 된 "글로벌 유사"변수입니다. IIFE는 정의가 즉시 호출되는 함수입니다.

이제 IIFE는 어떻게 작동합니까? 단서는 그 이름에 있습니다. 그것은 "FE"IIFE - 함수 표현식입니다.

function foo() {} 

및 사용 기능 식 :

foo = function() {} 

함수의 표현은 단순히 함수 선언 함수 선언을 사용하여 - 당신이 알고있는 자바 스크립트에서

, 기능을 만드는 두 가지 방법이있다 표현의 맥락에서 *. 자바 스크립트의 표현식은 무엇입니까? 단순히 뭔가를 평가하는 진술.= 기호 중괄호

(/* expression */) 

그래서 TRA에서

a = /* expression */ 
  • 아무것도의 오른쪽에

    1. 아무것도 :

      은 전통적으로 사람들은 같은 표현을 인식

      foo = function(){} 
      

      (function(){}) 
      

      그리고 두 번째 구문은 다음 식에 의해 반환 된 함수 객체를 실행하는 것을 쉽게 : ditionally 그 기능 식을 선언하는 두 개의 "표준"방법이 있습니다. 그러나 실제로, 표현은 js가 수학 (또는 논리, 수학은 어쨌든)을 수행하는 곳이면 어디든 가능합니다. 따라서 연산자를 함수 선언에 추가하면 표현식이됩니다.

      !function(){}() 
      
      +function(){}() 
      
      -function(){}() // I especially like this one because it 
             // looks like a command line switch 
      
      typeof function(){}() 
      

      그러나 당신이 몇 가지 던져 - 멀리 값 또는 변수를 사용하는 경우는 바이너리 연산자를 사용할 수 있습니다 : 다음 작품은 그들 (그들은 왼쪽에 아무것도없이 합법적 의미) 단항 연산자이기 때문에. 다음도 작동 :

      x=function(){}() 
      0==function(){}() 
      1*function(){}() 
      2/function(){}() 
      

      도대체, 당신도 삼항 연산자를 남용 할 수

      0?0:function(){}() // valid and works! 
      

      그것에 대해 마법은 어디에도 없습니다. 그것은 자바 스크립트로 구운 특정 구문이 아니에요. (function(){}())과 마찬가지로 IIFE의 특정 구문이 아닙니다. 표현식에서 선언 할 때 함수는 스스로를 즉시 호출 할 수있는 객체로 반환합니다.

      그러나 위의 비표준 양식 중 하나를 사용하지 말 것을 권합니다. 같은 이유로 당신은이 질문을했습니다. 대부분의 자바 스크립트 프로그래머는 그것을 보는 데 익숙하지 않아 혼동을 일으킬 수 있습니다. 나는 너 자신이 질문 할 때까지이 일을 할 수 있다는 것을 깨닫지 못했다. 내가 "컨텍스트"를 사용하고 있습니다 *


      는 전통적인 정의는 여기에서 "컨텍스트의 자바 스크립트 특별한 의미 아니다에 아직도, 그것은 당신이 사용해 minifier 같은 것들, 코드 생성기 등을 작성해야 할 때 알 수있는 유용한 것입니다 "사양에 정의 된대로.