[javascript] 느낌표는 기능 전에 무엇을합니까?

!function () {}();



답변

JavaScript 구문 101. 다음은 함수 선언 .

function foo() {}

세미콜론은 없습니다 : 이것은 단지 함수 선언 입니다. foo()실제로 함수를 실행하려면 호출이 필요합니다 .

무해한 느낌표를 추가 !function foo() {}하면 표현 . 이제 함수 표현식 입니다.

!혼자는 물론, 함수 호출하지 않지만, 우리는 지금 넣을 수 있습니다() 말 : !function foo() {}()보다 더 높은 우선 순위를 가지고 있습니다 !및 즉시 함수를 호출합니다.

저자가하는 일은 함수 표현 식당 바이트를 저장하는 것입니다. 더 읽기 쉬운 방법은 다음과 같습니다.

(function(){})();

마지막으로 !표현식이 true를 반환합니다. 이는 기본적으로 모든 인생 리턴입니다 undefined우리 잎, !undefined이다 true. 특별히 유용하지 않습니다.


답변

함수:

function () {}

아무것도 (또는 정의되지 않은) 반환합니다.

때로는 함수를 만들 때 바로 함수를 호출하려고합니다. 이것을 시도하고 싶을 수도 있습니다.

function () {}()

그러나 결과는 SyntaxError입니다.

!함수 앞에 연산자를 사용하면 함수가 표현식으로 취급되므로 다음과 같이 호출 할 수 있습니다.

!function () {}()

이는 또한이 경우에, 함수의 리턴 값의 부울 반대 반환 true때문 !undefined이다 true. 실제 리턴 값이 호출의 결과가되도록하려면 다음과 같이하십시오.

(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


답변

우리가 자바 스크립트 축소를 할 때 데이터 바이트를 저장하는 것입니다.

아래의 익명 기능을 고려하십시오.

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