JavaScript 클로저 기능의 기본 사용 및 발생한 문제에 대한 솔루션

不言
풀어 주다: 2018-10-23 15:17:32
앞으로
2288명이 탐색했습니다.

이 기사의 내용은 JavaScript 클로저 기능의 기본 사용법과 발생한 문제에 대한 해결책입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

인터뷰 때마다 클로저가 무엇인지 묻는 질문을 받았는데, 예전에는 요약은커녕 별로 관심도 없었습니다.

#🎜🎜 # 클로저 다른 함수의 내부 변수를 읽을 수 있는 함수입니다. 그래서 클로저란 본질적으로 함수 내부와 함수 외부를 연결하는 다리입니다.

(1) 가장 기본적인 클로저 적용:

少废话,上代码

还是<<javascript高级程序设计>>的栗子,
로그인 후 복사
로그인 후 복사
function createComparisonFunction(propertyName) {
    return function(object1, object2) {
        var value1 = object1[propertyName];
        var value2 = object2[propertyName];

        if(value1 < value2) {
            return -1;
        } else if(value1 > value2) {
            return 1;
        } else {
            return 0;
        }
    };
}
var compare = createComparisonFunction("name"); 

var result = compare({ name: "Nicholas" }, { name: "Greg" });
로그인 후 복사
로그인 후 복사
분석:

(1) 클로저 함수는 외부 함수에 접근할 수 있습니다
return out 이 익명 함수는 클로저 함수입니다. 이 익명 함수의 외부 함수에 액세스하는 활성 개체는 propertyName 매개 변수입니다. 외부 범위 체인이 이 익명 함수에 포함되어 있기 때문에(비교 함수에
createComparisonFunction() 함수의 활성 개체와 전역 변수 개체가 포함되어 있다고 이해될 수도 있음), 반환된 익명 함수는 항상 해당 함수에 액세스할 수 있습니다. external 이 propertyName 및 전역 변수입니다.
(2) 클로저가 참조하는 외부 변수는 해당 변수가 위치한 범위가 파괴되어도 파괴되지 않습니다.
외부 함수의 활성 객체는 반환된 클로저 함수에서 참조되므로, 따라서 createComparisonFunction()이 실행된 후에 활성 개체(예: propertyName)가 삭제되지 않습니다. createComparisonFunction은 실행 후 실행 환경에서 범위 체인을 삭제하지만 해당 활성 객체는 여전히 클로저 함수에 의해 참조되고 익명 함수의 실행 환경 범위에 배치됩니다.
#🎜🎜 #(2) Side 클로저의 효과

(1). 클로저는 포함하는 함수에 있는 모든 변수의 마지막 값만 얻을 수 있습니다

        function createFunctions(){ 
            var result = new Array(); 
            for (var i=0; i < 10; i++){ 
                result[i] = function(){ 
                return i; 
                }; 
            } 
            return result; 
        }
        
        var res = createFunctions();
        console.log(res[0]());  //10
        console.log(res[1]());  //10
로그인 후 복사
로그인 후 복사

Principle:

Because createFunctions() 함수는 각 함수의 범위 체인에 저장되므로 모두 동일한 변수 i를 참조합니다. createFunctions() 함수가 반환되면 변수 i의 값은 10이 됩니다. 이때 각 함수는 변수 i를 저장하는 동일한 변수 객체를 참조하므로 각 함수 내부의 i 값은 10

#🎜 🎜 #해결책:

获取内部函数的对象result[i]时,使用匿名函数,并在匿名函数中再使用闭包函数,使得当前环境下的num被闭包函数函数调用,存储在作用域中不会被释放.
로그인 후 복사
로그인 후 복사
        function  createFunctions2(){
            var result  = new Array();
            for(var i = 0 ; i <10 ; i++){
                result[i] = (function(num){
                    return function(){
                        return num
                    }
                })(i)
            }
            return result;
        }
        
        var res2 =  createFunctions2();
        console.log(res2[0]());  // 0 
        console.log(res2[1]());  // 1
로그인 후 복사
로그인 후 복사
원리:

익명 함수를 정의하고 익명 함수의 즉각적인 실행 결과를 배열에 할당합니다. 여기서 익명 함수에는 최종 함수에서 반환할 값인 매개 변수 num이 있습니다. 각 익명 함수를 호출할 때 변수 i를 전달합니다. 함수 매개변수는 값으로 전달되므로 변수 i의 현재 값이 매개변수 num에 복사됩니다. 이 익명 함수 내에서 num에 액세스하는 클로저가 생성되고 반환됩니다. 이렇게 하면 결과 배열의 각 함수에 num 변수의 자체 복사본이 있으므로 다른 값을 반환할 수 있습니다.

(2) 익명 함수가 클로저 함수 외부에 포함된 경우 이는 전역

        var name = "The Window";
        var object = {
            name: "My Object",
            getNameFunc: function () {   
                return function () {        //匿名函数执行具有全局性
                    return this.name;       //this指向window
                };
            }
        };

        console.log(object.getNameFunc()())  //  The Window
로그인 후 복사
로그인 후 복사
Principle:

각 함수는 자동으로 두 개의 특수 함수를 가져옵니다. 변수: this 및 인수. 내부 함수

는 이 두 변수를 검색할 때 활성 객체까지만 검색하므로 외부 this를 얻을 수 없습니다. 이때 getNameFunc()는 익명 함수를 반환하며, 익명 함수는 전역입니다. 그래서 이것은 전역 창을 가리킵니다


해결책:
이 개체를 클로저가 액세스할 수 있는 변수의 외부 범위에 저장하여 클로저가 개체에 액세스할 수 있도록

    var name2 =  "The  Window";
    var object2 = {
        name:"My Object",
        getNameFunc:function(){
            var that =  this; //将外部函数的this保存在外部函数的活动对象中(函数中申明的变量中)
            return function (){
                return that.name
            }
        }
    }
    
    console.log(object2.getNameFunc()())   //My Object
로그인 후 복사
로그인 후 복사


(3)

클로저의 단점
(1) 클로저는 이를 포함하는 함수의 범위를 전달하므로 다른 함수보다 작습니다. 메모리. 클로저를 과도하게 사용하면 과도한 메모리 사용량이 발생할 수 있습니다

(2) 클로저는 포함하는 함수에 있는 모든 변수의 마지막 값만 얻을 수 있으므로

#🎜🎜 쓰기에 주의하세요. #
칼럼



~

姧姧鲁                                                                                                                                                  ~ ~                                                                                      3분 전에 게시됨                                              7번 읽으세요                                                          읽는 데 12분이 걸립니다.                                         ~ ~ ~                                                                                                                                                                                                                                                                                                        被 면접 때 클로저가 무엇인지 질문을 받았는데, 예전에는 크게 신경 쓰지 않았고, 요약하고 유도하지도 않았습니다. JavaScript 클로저 기능의 기본 사용 및 발생한 문제에 대한 솔루션 클로저 .

그래서 클로저란 본질적으로 함수 내부와 함수 외부를 연결하는 다리입니다.

(1) 클로저의 가장 기본적인 적용:

少废话,上代码

还是<<javascript高级程序设计>>的栗子,
로그인 후 복사
로그인 후 복사
function createComparisonFunction(propertyName) {
    return function(object1, object2) {
        var value1 = object1[propertyName];
        var value2 = object2[propertyName];

        if(value1 < value2) {
            return -1;
        } else if(value1 > value2) {
            return 1;
        } else {
            return 0;
        }
    };
}
var compare = createComparisonFunction("name"); 

var result = compare({ name: "Nicholas" }, { name: "Greg" });
로그인 후 복사
로그인 후 복사

분석:
(1) 클로저 함수는 외부 함수에 액세스할 수 있습니다.
반환된 익명 함수는 클로저 함수이며, 외부 함수는 이 익명 함수에서 액세스됩니다. 개체는 propertyName 매개변수입니다. 외부 범위 체인이 이 익명 함수에 포함되어 있기 때문에(비교 함수에는 createComparisonFunction() 함수의 활성 객체와 전역 변수 객체가 포함되어 있다고 이해될 수도 있음), 반환된 익명 함수는 항상 외부 propertyName 및 Global에 액세스할 수 있습니다. 변수.
(2) 클로저가 참조하는 외부 변수는 해당 변수가 위치한 범위가 파괴되어도 소멸되지 않습니다.
외부 함수의 활성 개체는 반환된 클로저 함수에서 참조되므로 활성 개체(예: propertyName ) in createComparisonFunction() createComparisonFunction()이 실행된 후에도 삭제되지 않습니다. createComparisonFunction은 실행 후 실행 환경에서 범위 체인을 삭제하지만 해당 활성 객체는 여전히 클로저 함수에 의해 참조되고 익명 함수의 실행 환경 범위에 배치됩니다. (2) 패키지의 클로저 부작용

(1) . 클로저는 함수에 있는 모든 변수의 마지막 값만 가져올 수 있습니다.
        function createFunctions(){ 
            var result = new Array(); 
            for (var i=0; i < 10; i++){ 
                result[i] = function(){ 
                return i; 
                }; 
            } 
            return result; 
        }
        
        var res = createFunctions();
        console.log(res[0]());  //10
        console.log(res[1]());  //10
로그인 후 복사
로그인 후 복사

원리:

createFunctions() 함수의 활성 객체는 각 함수의 범위 체인에 저장되므로 모두 동일한 변수 i를 참조합니다. createFunctions() 함수가 반환되면 변수 i의 값은 10이 됩니다. 이때 각 함수는 변수 i를 저장하는 동일한 변수 객체를 참조하므로 각 함수 내부의 i 값은 10

해결책:

获取内部函数的对象result[i]时,使用匿名函数,并在匿名函数中再使用闭包函数,使得当前环境下的num被闭包函数函数调用,存储在作用域中不会被释放.
로그인 후 복사
로그인 후 복사
        function  createFunctions2(){
            var result  = new Array();
            for(var i = 0 ; i <10 ; i++){
                result[i] = (function(num){
                    return function(){
                        return num
                    }
                })(i)
            }
            return result;
        }
        
        var res2 =  createFunctions2();
        console.log(res2[0]());  // 0 
        console.log(res2[1]());  // 1
로그인 후 복사
로그인 후 복사

원리:익명 함수를 정의하고 익명 함수를 즉시 실행한 결과를 배열에 할당합니다. 여기서 익명 함수에는 최종 함수에서 반환할 값인 매개 변수 num이 있습니다. 각 익명 함수를 호출할 때 변수 i를 전달합니다. 함수 매개변수는 값으로 전달되므로 변수 i의 현재 값이 매개변수 num에 복사됩니다. 이 익명 함수 내에서 num에 액세스하는 클로저가 생성되고 반환됩니다. 이렇게 하면 결과 배열의 각 함수에 num 변수의 자체 복사본이 있으므로 다른 값을 반환할 수 있습니다.

(2) 익명 함수가 클로저 함수 외부에 포함되면 전역

        var name = "The Window";
        var object = {
            name: "My Object",
            getNameFunc: function () {   
                return function () {        //匿名函数执行具有全局性
                    return this.name;       //this指向window
                };
            }
        };

        console.log(object.getNameFunc()())  //  The Window
로그인 후 복사
로그인 후 복사

Principle을 가리킵니다. 각 함수는 호출될 때 자동으로 두 개의 특수 변수인 this와 인수를 얻습니다. 내부 함수는 이 두 변수를 검색할 때 활성 개체까지만 검색하므로 외부 this를 얻을 수 없습니다. 이때 getNameFunc()는 익명 함수를 반환하며 익명 함수는 전역이므로 이 Point를 가리킵니다. 전역 창

해결책:

이 개체를 클로저가 액세스할 수 있는 변수의 외부 범위에 저장하면 클로저가 개체에 액세스할 수 있습니다

    var name2 =  "The  Window";
    var object2 = {
        name:"My Object",
        getNameFunc:function(){
            var that =  this; //将外部函数的this保存在外部函数的活动对象中(函数中申明的变量中)
            return function (){
                return that.name
            }
        }
    }
    
    console.log(object2.getNameFunc()())   //My Object
로그인 후 복사
로그인 후 복사

(3)

클로저 단점
(1). 이를 포함하는 함수의 범위에 따라 다른 함수보다 더 많은 메모리를 차지하게 됩니다. 클로저를 과도하게 사용하면 과도한 메모리 사용량이 발생할 수 있습니다

(2) 클로저는 포함하는 함수에 있는 모든 변수의 마지막 값만 얻을 수 있으므로 작성 방법에 주의하세요





  • JavaScript 클로저 기능의 기본 사용 및 발생한 문제에 대한 솔루션

  • 신고


당신이 관심을 가질 수도 있습니다




댓글

~ 시간 정렬 载 로드 ...

댓글 더 보기


위 내용은 JavaScript 클로저 기능의 기본 사용 및 발생한 문제에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿