!function () {}();
!function () {}();
답변:
JavaScript 구문 101. 다음은 함수 선언 .
function foo() {}
세미콜론은 없습니다 : 이것은 단지 함수 선언 입니다. foo()
실제로 함수를 실행하려면 호출이 필요합니다 .
무해한 느낌표를 추가 !function foo() {}
하면 표현 . 이제 함수 표현식 입니다.
!
혼자는 물론, 함수 호출하지 않지만, 우리는 지금 넣을 수 있습니다()
말 : !function foo() {}()
보다 더 높은 우선 순위를 가지고 있습니다 !
및 즉시 함수를 호출합니다.
저자가하는 일은 함수 표현 식당 바이트를 저장하는 것입니다. 더 읽기 쉬운 방법은 다음과 같습니다.
(function(){})();
마지막으로 !
표현식이 true를 반환합니다. 이는 기본적으로 모든 인생 리턴입니다 undefined
우리 잎, !undefined
이다 true
. 특별히 유용하지 않습니다.
!
부울을 반환하지만, 우리 모두 알고 있지만, 중요한 점은 함수 선언문을 함수 표현식으로 변환하여 괄호로 묶지 않고 함수를 즉시 호출 할 수 있다는 것입니다. 명확하지 않으며 코더의 의도가 분명합니다.
var foo =
는 진술 / 표현 모호함을 깨뜨리고 간단히 쓸 수 있습니다 var foo = function(bar){}("baz");
.
함수:
function () {}
아무것도 (또는 정의되지 않은) 반환합니다.
때로는 함수를 만들 때 바로 함수를 호출하려고합니다. 이것을 시도하고 싶을 수도 있습니다.
function () {}()
그러나 결과는 SyntaxError
입니다.
!
함수 앞에 연산자를 사용하면 함수가 표현식으로 취급되므로 다음과 같이 호출 할 수 있습니다.
!function () {}()
이는 또한이 경우에, 함수의 리턴 값의 부울 반대 반환 true
때문 !undefined
이다 true
. 실제 리턴 값이 호출의 결과가되도록하려면 다음과 같이하십시오.
(function () {})()
!
함수 선언을 함수 표현식으로 바꾸는 것입니다.
!function
문법 을 사용 합니다
airbnb JavaScript 가이드!
에 표시된 함수 호출 에 사용 하기에 좋은 점이 있습니다
일반적으로이 기술을 나중에 연결되는 별도의 파일 (일명 모듈)에서 사용하기위한 아이디어입니다. 여기서주의해야 할 점은 새 파일을 새 줄에 넣는 도구에 의해 파일이 연결되어 있어야한다는 것입니다 (어쨌든 대부분의 연결 도구의 일반적인 동작). 이 경우, !
이전에 연결된 모듈에서 세미콜론이 누락 된 경우 오류를 피하는 데 도움이되지만, 걱정없이 순서에 상관없이 유연하게 사용할 수 있습니다.
!function abc(){}();
!function bca(){}();
와 동일하게 작동합니다
!function abc(){}();
(function bca(){})();
하나의 문자를 저장하고 임의의 모양이 더 좋습니다.
그리고 그 방법 중 하나로 +
, -
, ~
, void
당신은 그들이 다르게 행동 것이라고 함수에서 반환하는 것을 사용하는 경우 사업자는 확실히 함수를 호출하는 측면에서, 같은 효과가 있습니다.
abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?
그러나 하나의 파일 하나의 모듈 코드 분리에 IIFE 패턴을 사용하고 최적화를 위해 concat 도구를 사용하면 (한 줄 하나의 파일 작업을 수행함) 구성
!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()
첫 번째 코드 샘플과 마찬가지로 안전한 코드 실행을 수행합니다.
이것은 JavaScript ASI가 작업을 수행 할 수 없기 때문에 오류를 발생시킵니다.
!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()
단항 연산자에 대한 한 가지 참고 사항은 비슷한 작업을 수행하지만 첫 번째 모듈에서 사용하지 않은 경우에만 해당됩니다. 따라서 연결 순서를 완전히 제어하지 않으면 안전하지 않습니다.
이것은 작동합니다 :
!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()
이것은 아닙니다 :
^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()
명령문이 false로 평가 될 수 있는지 여부를 리턴합니다. 예 :
!false // true
!true // false
!isValid() // is not valid
부울 값을 강제로 두 번 사용할 수 있습니다.
!!1 // true
!!0 // false
따라서 귀하의 질문에보다 직접적으로 대답하려면 :
var myVar = !function(){ return false; }(); // myVar contains true
편집 : 함수 선언을 함수 표현식으로 변경하면 부작용이 있습니다. 예를 들어 다음 코드는 필수 식별자 (또는 함수 이름 ) 가없는 함수 선언으로 해석되므로 유효하지 않습니다 .
function () { return false; }(); // syntax error
var myVar = !function(){ return false; }()
가 !
유사하게 생략 될 수 var myVar = function(){ return false; }()
있으며 함수가 올바르게 실행되고 반환 값은 변경되지 않습니다.
true
와 !0
와 false
함께 !1
. 2 ~ 3자를 저장합니다.
우리가 자바 스크립트 축소를 할 때 데이터 바이트를 저장하는 것입니다.
아래의 익명 기능을 고려하십시오.
function (){}
위의 내용을 자체 호출 기능으로 만들려면 일반적으로 위의 코드를 다음과 같이 변경합니다.
(function (){}())
이제 함수를 호출하는 데 필요한 함수 끝에 (,)
추가하는 것 외에 두 개의 추가 문자 를 추가 ()
했습니다. 축소 과정에서 일반적으로 파일 크기를 줄이는 데 중점을 둡니다. 위 함수를 다음과 같이 쓸 수도 있습니다.
!function (){}()
여전히 두 가지 모두 자체 호출 기능이며 바이트도 절약합니다. 2 개의 문자 대신에 (,)
한 문자 만 사용했습니다.!
! 논리 NOT 연산자이며, 반대 방향으로 무언가를 뒤집는 부울 연산자입니다.
함수 앞에 BANG (!) 을 사용하여 호출 된 함수의 괄호를 무시할 수는 있지만 여전히 리턴을 반전 시키므로 원하는 결과가 아닐 수도 있습니다. IEFE의 경우와 마찬가지로 undefined를 반환 하며,이 값은 반전되면 부울 true가됩니다.
대신 필요한 경우 닫는 괄호와 BANG ( ! )을 사용하십시오.
// I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.
(function(){ return false; }());
=> false
!(function(){ return false; }());
=> true
!!(function(){ return false; }());
=> false
!!!(function(){ return false; }());
=> true
작동하는 다른 연산자 ...
+(function(){ return false; }());
=> 0
-(function(){ return false; }());
=> -0
~(function(){ return false; }());
=> -1
결합 연산자 ...
+!(function(){ return false; }());
=> 1
-!(function(){ return false; }());
=> -1
!+(function(){ return false; }());
=> true
!-(function(){ return false; }());
=> true
~!(function(){ return false; }());
=> -2
~!!(function(){ return false; }());
=> -1
+~(function(){ return false; }());
+> -1
느낌표는 모든 함수가 항상 부울을 반환하도록합니다.
최종 값은 함수에 의해 반환 된 값의 부정입니다.
!function bool() { return false; }() // true
!function bool() { return true; }() // false
!
위의 예제에서 생략 하면 SyntaxError가 됩니다.
function bool() { return true; }() // SyntaxError
그러나 이것을 달성하는 더 좋은 방법은 다음과 같습니다.
(function bool() { return true; })() // true
!
런타임이 함수를 구문 분석하는 방식을 변경합니다. 런타임이 함수를 선언이 아닌 함수 표현식으로 처리합니다. 이를 통해 개발자는 ()
구문을 사용하여 즉시 함수를 호출 할 수 있습니다 . !
함수 표현식을 호출 한 결과에 자체 (즉, 부정)도 적용됩니다.
!
결과적으로 예상되는 모든 것을 부정 (반대)합니다.
var boy = true;
undefined
boy
true
!boy
false
호출 할 때 boy
결과는 true
나오지만 !
호출 할 때 를 추가하는 순간 boy
, 즉 !boy
결과는 다음과 같습니다 false
. 즉 , NotBoy 를 의미 하지만 이번에는 기본적으로 부울 결과 true
또는 false
입니다.
그것은 !function () {}();
표현식에서 발생하는 것과 똑같은 일이며 , 실행 function () {}();
하면 오류 만 표시하지만 표현식 !
바로 앞에 추가 function () {}();
하면 반대의 결과 function () {}();
가 true
됩니다. 아래에서 예를 볼 수 있습니다.
function () {}();
SyntaxError: function statement requires a name
!function () {}();
true