웹 프론트엔드 JS 튜토리얼 Javascript의 익명 함수 및 자체 실행

Javascript의 익명 함수 및 자체 실행

Oct 13, 2016 am 10:21 AM

함수 정의는 크게 세 가지로 나눌 수 있습니다.

첫 번째: 이것도 가장 일반적인 정의입니다

function double(x){    
    return 2 * x;       
}
로그인 후 복사

두 번째: 이 방법은 함수 생성자가 사용하는 방법입니다. 매개변수 목록과 함수 본문을 모두 문자열로 처리하는 것은 매우 불편하고 권장되지 않습니다.

var double = new Function('x', 'return 2 * x;');
로그인 후 복사

세 번째 방법:

var double = function(x) { return 2* x; }
로그인 후 복사

참고로 "=" 오른쪽에 있는 함수는 함수를 생성한 후 해당 함수에 할당됩니다. 가변 정사각형.

익명 함수 생성

첫 번째 방법: 위에서 언급한 대로 제곱 함수를 정의하는데, 이 역시 가장 일반적으로 사용되는 방법 중 하나입니다.

두 번째 방법:

(function(x, y){   
    alert(x + y);     
})(2, 3);
로그인 후 복사

여기서 익명 함수가 생성되고(첫 번째 대괄호에) 두 번째 대괄호는 익명 함수를 호출하고 매개변수를 전달하는 데 사용됩니다. 괄호는 표현식이고 표현식에는 반환 값이 있으므로 끝에 괄호 한 쌍을 추가하여 실행되도록 할 수 있습니다. 🎜 >

1. 자체 실행 익명 함수란 무엇인가요?

다음과 같은 형태의 함수를 말합니다: (함수 {//코드})();

2. 질문

(function {// code})(); 실행이 가능한데 왜 {// code}(); 오류가 발생하나요?

3. 분석 (1) 먼저 둘 사이의 차이점을 이해해야 합니다.

(함수 {//코드})는 표현식이고, 함수 {//코드}는 함수 선언입니다. (2) 둘째, js는 "사전 컴파일" 기능입니다.
"사전 컴파일" 단계에서 js는 함수 선언을 해석하지만 표현식은 무시합니다.
(3) js가 function() {//코드로 실행될 때. }();, function() {//code}가 "컴파일 전" 단계에서 설명되었기 때문에 js는 function(){//code}을 건너뛰고 ();를 실행하려고 시도하므로 오류가 발생합니다.
js가 실행될 때 (function {// code})();일 때 (function {// code})는 표현식이므로 js는 반환 값을 얻기 위해 이를 해결합니다.

또한 함수를 표현식으로 변환하는 방법은 반드시 그룹화 연산자()에 의존할 필요는 없습니다. 연산자, ~ 연산자, ! 연산자...

예:


익명 함수 및 클로저

클로저의 영어 단어는 다음과 같습니다. 클로저를 사용하면 코드의 양을 크게 줄이고 코드를 더 명확하게 보이게 할 수 있기 때문에 JavaScript 지식의 매우 중요한 부분인 클로저입니다. 간단히 말해서 매우 강력합니다.

클로저의 의미: 직설적으로 말하면 클로저는 함수의 중첩입니다. 외부 함수가 실행되더라도 내부 함수는 외부 함수의 모든 변수를 사용할 수 있습니다(여기에는 JavaScript 범위 체인이 포함됩니다). ) . <… body에 str 변수가 생성됩니다. checkClosure가 실행된 후 str이 해제되지 않습니다. 이는 setTimeout의 익명 함수에 str에 대한 참조가 있기 때문입니다. 2초 후 함수 본문의 익명 함수가 실행되고 str이 해제됩니다.

!function(){   
  alert("另类的匿名函数自执行");   
}();
로그인 후 복사

클로저를 사용하여 코드 최적화:

익명 함수의 가장 큰 용도는 클로저를 만드는 것입니다(이것은 JavaScript 언어의 기능 중 하나입니다). 또한 전역 변수의 사용을 줄이기 위해 네임스페이스를 구성할 수도 있습니다.

이 코드에서 addEvent, RemoveEvent 함수는 로컬 변수이지만, 전역 변수 oEvent를 통해 사용할 수 있어 전역 변수의 사용을 대폭 줄이고 웹 페이지의 보안을 강화합니다. 우리는 다음 코드를 사용하고 싶습니다: oEvent.addEvent(document.getElementById('box'), 'click', function(){});
function checkClosure(){  
    var str = &#39;rain-man&#39;;  
    setTimeout(  
        function(){ alert(str); } //这是一个匿名函数  
    , 2000);  
}  
checkClosure();
로그인 후 복사

여기서 rainman 변수를 생성하고 초기화합니다. 이 작은 트릭은 때때로 매우 실용적입니다.

이 코드의 변수 one은 (함수 내에서 정의되기 때문에) 지역 변수이므로 외부에서 접근할 수 없습니다. 하지만 여기서는 변수 1에 액세스할 수 있는 내부 함수를 만들었고 전역 변수 외부는 내부를 참조하므로 외부를 세 번 호출하면 증분 결과가 나타납니다.

function forTimeout(x, y){  
    alert(x + y);  
}  
function delay(x , y  , time){  
    setTimeout(&#39;forTimeout(&#39; +  x + &#39;,&#39; +  y + &#39;)&#39; , time);      
}  
/**  
 * 上面的delay函数十分难以阅读,也不容易编写,但如果使用闭包就可以让代码更加清晰  
 * function delay(x , y , time){  
 *     setTimeout(  
 *         function(){  
 *             forTimeout(x , y)   
 *         }            
 *     , time);     
 * }  
 */
로그인 후 복사

var oEvent = {};  
(function(){   
    var addEvent = function(){ /*代码的实现省略了*/ };  
    function removeEvent(){}  
     
    oEvent.addEvent = addEvent;  
    oEvent.removeEvent = removeEvent;  
})();
로그인 후 복사

참고

var rainman = (function(x , y){  
    return x + y;  
})(2 , 3);  
/**  
 * 也可以写成下面的形式,因为第一个括号只是帮助我们阅读,但是不推荐使用下面这种书写格式。  
 * var rainman = function(x , y){  
 *    return x + y;  
 * }(2 , 3);
로그인 후 복사

1 클로저를 사용하면 내부 함수가 상위 함수의 변수를 참조할 수 있지만 변수는 최종 값
var outer = null;  
     
(function(){  
    var one = 1;  
    function inner (){  
        one += 1;  
        alert(one);  
    }  
    outer = inner;  
})();  
     
outer();    //2  
outer();    //3  
outer();    //4
로그인 후 복사

마우스를 각

요소 위로 이동할 때 우리가 기대하는 요소 첨자가 아닌 4가 항상 나타나는 것을 알 수 있습니다. 왜 이런가요? 이미 메모(최종 값)에 언급되어 있습니다. 분명히 이 설명은 너무 간단합니다. mouseover 이벤트가 수신 함수를 호출하면 먼저 익명 함수(function(){alert(i); }) 내부를 검색하여 i가 정의되어 있는지 확인합니다. ; 따라서 위쪽으로 검색하여 찾습니다. 결과는 정의되었으며 i의 값은 4(루프 이후의 i 값)이므로 결국 매번 4가 나타납니다.

솔루션 1:

솔루션 2:

솔루션 3:

/**  
 * <body>  
 * <ul>  
 *     <li>one</li>  
 *     <li>two</li>  
 *     <li>three</li>  
 *     <li>one</li>  
 * </ul>  
 */
     
var lists = document.getElementsByTagName(&#39;li&#39;);  
for(var i = 0 , len = lists.length ; i < len ; i++){  
    lists[ i ].onmouseover = function(){  
        alert(i);      
    };  
}
로그인 후 복사

2 메모리 누수

  • 클로저를 사용하면 브라우저에서 메모리 누수가 쉽게 발생할 수 있습니다. 심각한 경우 브라우저가 중단될 수 있습니다.

    var lists = document.getElementsByTagName(&#39;li&#39;);  
    for(var i = 0 , len = lists.length ; i < len ; i++){  
        (function(index){  
            lists[ index ].onmouseover = function(){  
                alert(index);      
            };                      
        })(i);  
    }
    로그인 후 복사

  • 본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    메모장++7.3.1

    메모장++7.3.1

    사용하기 쉬운 무료 코드 편집기

    SublimeText3 중국어 버전

    SublimeText3 중국어 버전

    중국어 버전, 사용하기 매우 쉽습니다.

    스튜디오 13.0.1 보내기

    스튜디오 13.0.1 보내기

    강력한 PHP 통합 개발 환경

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    SublimeText3 Mac 버전

    SublimeText3 Mac 버전

    신 수준의 코드 편집 소프트웨어(SublimeText3)

    내 자신의 JavaScript 라이브러리를 어떻게 작성하고 게시합니까? 내 자신의 JavaScript 라이브러리를 어떻게 작성하고 게시합니까? Mar 18, 2025 pm 03:12 PM

    기사는 JavaScript 라이브러리 작성, 게시 및 유지 관리, 계획, 개발, 테스트, 문서 및 홍보 전략에 중점을 둡니다.

    브라우저에서 성능을 위해 JavaScript 코드를 최적화하려면 어떻게해야합니까? 브라우저에서 성능을 위해 JavaScript 코드를 최적화하려면 어떻게해야합니까? Mar 18, 2025 pm 03:14 PM

    이 기사는 브라우저에서 JavaScript 성능을 최적화하기위한 전략에 대해 설명하고 실행 시간을 줄이고 페이지로드 속도에 미치는 영향을 최소화하는 데 중점을 둡니다.

    프론트 엔드 열 용지 영수증에 대한 차량 코드 인쇄를 만나면 어떻게해야합니까? 프론트 엔드 열 용지 영수증에 대한 차량 코드 인쇄를 만나면 어떻게해야합니까? Apr 04, 2025 pm 02:42 PM

    프론트 엔드 개발시 프론트 엔드 열지대 티켓 인쇄를위한 자주 묻는 질문과 솔루션, 티켓 인쇄는 일반적인 요구 사항입니다. 그러나 많은 개발자들이 구현하고 있습니다 ...

    브라우저 개발자 도구를 사용하여 JavaScript 코드를 효과적으로 디버그하려면 어떻게해야합니까? 브라우저 개발자 도구를 사용하여 JavaScript 코드를 효과적으로 디버그하려면 어떻게해야합니까? Mar 18, 2025 pm 03:16 PM

    이 기사는 브라우저 개발자 도구를 사용하여 효과적인 JavaScript 디버깅, 중단 점 설정, 콘솔 사용 및 성능 분석에 중점을 둡니다.

    소스 맵을 사용하여 조정 된 JavaScript 코드를 디버그하는 방법은 무엇입니까? 소스 맵을 사용하여 조정 된 JavaScript 코드를 디버그하는 방법은 무엇입니까? Mar 18, 2025 pm 03:17 PM

    이 기사는 소스 맵을 사용하여 원래 코드에 다시 매핑하여 미니어링 된 JavaScript를 디버그하는 방법을 설명합니다. 소스 맵 활성화, 브레이크 포인트 설정 및 Chrome Devtools 및 Webpack과 같은 도구 사용에 대해 설명합니다.

    Java의 컬렉션 프레임 워크를 효과적으로 사용하려면 어떻게해야합니까? Java의 컬렉션 프레임 워크를 효과적으로 사용하려면 어떻게해야합니까? Mar 13, 2025 pm 12:28 PM

    이 기사는 Java의 컬렉션 프레임 워크의 효과적인 사용을 탐구합니다. 데이터 구조, 성능 요구 및 스레드 안전을 기반으로 적절한 컬렉션 (목록, 세트, ​​맵, 큐)을 선택하는 것을 강조합니다. 효율적인 수집 사용을 최적화합니다

    초보자를위한 타이프 스크립트, 2 부 : 기본 데이터 유형 초보자를위한 타이프 스크립트, 2 부 : 기본 데이터 유형 Mar 19, 2025 am 09:10 AM

    엔트리 레벨 타입 스크립트 자습서를 마스터 한 후에는 TypeScript를 지원하고 JavaScript로 컴파일하는 IDE에서 자신의 코드를 작성할 수 있어야합니다. 이 튜토리얼은 TypeScript의 다양한 데이터 유형으로 뛰어납니다. JavaScript에는 NULL, UNDEFINED, BOOLEAN, 번호, 문자열, 기호 (ES6에 의해 소개 됨) 및 객체의 7 가지 데이터 유형이 있습니다. TypeScript는이 기반으로 더 많은 유형을 정의 하며이 튜토리얼은이 모든 튜토리얼을 자세히 다룹니다. 널 데이터 유형 JavaScript와 마찬가지로 Null in TypeScript

    Chart.js : Pie, Donut 및 Bubble Charts를 시작합니다 Chart.js : Pie, Donut 및 Bubble Charts를 시작합니다 Mar 15, 2025 am 09:19 AM

    이 튜토리얼은 Chart.js를 사용하여 파이, 링 및 버블 차트를 만드는 방법을 설명합니다. 이전에는 차트 유형의 차트 유형을 배웠습니다. JS : 라인 차트 및 막대 차트 (자습서 2)와 레이더 차트 및 극지 지역 차트 (자습서 3)를 배웠습니다. 파이 및 링 차트를 만듭니다 파이 차트와 링 차트는 다른 부분으로 나뉘어 진 전체의 비율을 보여주는 데 이상적입니다. 예를 들어, 파이 차트는 사파리에서 남성 사자, 여성 사자 및 젊은 사자의 비율 또는 선거에서 다른 후보자가받는 투표율을 보여주는 데 사용될 수 있습니다. 파이 차트는 단일 매개 변수 또는 데이터 세트를 비교하는 데만 적합합니다. 파이 차트의 팬 각도는 데이터 포인트의 숫자 크기에 의존하기 때문에 원형 차트는 값이 0 인 엔티티를 그릴 수 없습니다. 이것은 비율이 0 인 모든 엔티티를 의미합니다

    See all articles