!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