etc./StackOverFlow

함수 앞에 느낌표는 무엇을 합니까?

청렴결백한 만능 재주꾼 2023. 4. 9. 15:43
반응형

질문자 :Sebastian Otto


!function () {}();


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

 function foo() {}

세미콜론이 없다는 점에 유의하십시오. 이것은 단지 함수 선언 입니다. 실제로 함수를 실행하려면 foo() 호출이 필요합니다.

이제 겉보기에 무해해 보이는 느낌표를 추가하면 !function foo() {} 표현식 으로 바뀝니다. 이제 함수 표현식 입니다.

! 물론 단독으로는 함수를 호출하지 않지만 이제 끝에 () !function foo() {}() 보다 우선 순위가 높습니다 ! 즉시 함수를 호출합니다.

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

 (function(){})();

마지막으로 ! 표현식이 true를 반환하도록 합니다. 이는 기본적으로 즉시 호출된 모든 함수 표현식(IIFE)이 undefined true !undefined 가 남게 됩니다. 특히 유용하지 않습니다.


Neil

함수:

 function () {}

아무 것도 반환하지 않습니다(또는 정의되지 않음).

때때로 우리는 함수를 생성할 때 바로 호출하고 싶을 때가 있습니다. 다음과 같이 시도하고 싶을 수 있습니다.

 function () {}()

그러나 SyntaxError 합니다.

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

 !function () {}()

!undefinedtrue 이기 때문에 함수의 반환 값의 반대 부울 값을 반환합니다. 이 경우에는 true 입니다. 실제 반환 값이 호출의 결과가 되도록 하려면 다음과 같이 하십시오.

 (function () {})()

Michael Burr

사용하면 좋은점이 있습니다 ! 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*/}()

dmi3y

명령문이 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

gilly3

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

아래 익명 함수를 고려하십시오

 function (){}

위의 내용을 자체 호출 함수로 만들기 위해 일반적으로 위의 코드를 다음과 같이 변경합니다.

 (function (){}())

이제 함수를 호출하는 데 필요한 함수 끝에 () 를 추가하는 것 외에 두 개의 추가 문자 (,) 축소 과정에서 우리는 일반적으로 파일 크기를 줄이는 데 중점을 둡니다. 따라서 위의 함수를 다음과 같이 작성할 수도 있습니다.

 !function (){}()

여전히 둘 다 자체 호출 함수이며 바이트도 저장합니다. (,) 대신에 1개의 문자만 사용했습니다 !


Varatharaj

느낌표는 모든 함수가 항상 부울을 반환하도록 합니다.
최종 값은 함수에서 반환된 값의 부정입니다.

 !function bool() { return false; }() // true !function bool() { return true; }() // false

생략 ! 위의 예에서 SyntaxError 가 됩니다.

 function bool() { return true; }() // SyntaxError

그러나 이를 달성하는 더 좋은 방법은 다음과 같습니다.

 (function bool() { return true; })() // true

oozzal

! 논리 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

SoEzPz

IIFE(즉시 호출된 함수 표현식)를 작성하는 또 다른 방법입니다.

다른 쓰기 방식 -

 (function( args ) {})()

같은

 !function ( args ) {}();

kamal

출처 : http:www.stackoverflow.com/questions/3755606/what-does-the-exclamation-mark-do-before-the-function

반응형