차이가 없습니다.
IIFE의 원리를 이해해야 합니다. 간단히 설명하겠습니다.
IIFE는 필수가 아닙니다. 더 전통적으로 작성하려면 다음과 같이 작성하세요.
그렇다면 왜 IIFE인가요?
1. 기존 방식은 번거롭고 정의와 실행이 별도로 작성되어 있습니다.
2. 기존 방식은 전역 네임스페이스(창 등 브라우저의 전역 객체)를 직접적으로 오염시킵니다.
그래서 개발자들은 위의 문제를 해결할 수 있는 방법을 찾고 싶어합니다. 그럼 이렇게 써도 괜찮나요?
함수 foo(...){}();
물론 그렇지 않습니다. 그런데 왜일까요? function foo(...){} 부분은 단지 명령문이기 때문에 인터프리터에게는 다음과 같은 구문 분석 함수를 사용해야 하는 문자열 "function foo(...){}"를 작성한 것과 같습니다. eval()을 실행합니다. 따라서 명령문 바로 뒤에 ()를 넣으면 실행되지 않습니다. 이는 잘못된 구문입니다.
어떻게 하면 올바르게 만들 수 있나요? 쉽게 말하면, 문장을 표현식(Expression)으로 바꾸면 됩니다.
실제로 표현식을 변환하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 함수 선언을 () 쌍으로 감싸는 것입니다.
다음과 같습니다.
하지만 이전에 작성이 불가능하다고 했던 방식은 실제로는 괄호로 직접 묶을 수도 있습니다.
(함수 foo(){...}());
그렇다면 차이가 있나요? 매우 간단합니다. 아니요~
또한 방금 말씀드린 것처럼 표현을 변형하는 방법에는 여러 가지가 있습니다. 다음과 같이 표현을 작성하는 방법도 많이 있습니다.
!function foo() {...}();
또는
함수 foo() {...}();
모두 괜찮습니다.
저는 개인적으로 void를 사용하여 표현식을 변환하는 것을 선호합니다. 이 키워드에는 반환 값이 없기 때문입니다. 하지만 이 점은 별로 중요하지 않습니다. 그냥 나를 "거북이"로 대하십시오…
좋아, 소위 전역 네임스페이스를 오염시키지 않는다는 것은 IIFE가 새로운 함수 범위를 생성하고 실제 비즈니스 코드가 그 안에 캡슐화되어 자연스럽게 전역 객체를 건드리지 않기 때문입니다. 전역 개체가 필요한 경우 IIFE에 전달하세요.
여기서 시리즈를 작성했는데 그 중 하나는 범위 및 명명 승격에 대한 내용입니다. 관심이 있으시면 계속해서 읽어보실 수 있습니다. http:// www.jb51 .net/article/75090.htm
방법 1, 함수를 호출하고 반환 값을 가져옵니다. 함수가 직접 실행되도록 강제한 다음 참조를 반환한 다음 이를 호출하여 실행합니다.
두 번째 방법은 함수를 호출하고 반환 값을 가져오는 것입니다. 강제 연산자는 함수 호출을 실행하게 합니다
(function(){})(); 함수를 표현식으로 구문 분석한 다음 구문 분석된 함수를 실행하는 것입니다
var a = function(){} a()와 동일하며
함수를 얻습니다.
(function(){}()); 함수 표현식을 직접 실행하고 명령문으로 실행하는 것입니다.
var a = function(){}(); a와 동일하며 결과를 얻습니다
결론은 똑같네요
()는 단지 자기실행의 역할을 할 뿐입니다
() 같은 게 더 많아요
예를 들어 함수 (){}
이는 (function (){})와 같습니다. 일반적으로 (function (){})에는 전역 변수를 방지하는 또 다른 효과가 있습니다