[함수 표현식] 패키지 닫기

3795 단어
함수 정의 방법:Function 유형
익명 함수 - function 키워드 뒤에 식별자가 없는 함수입니다.패키지 닫기 - 다른 함수 작용 영역의 변수에 접근할 수 있는 함수입니다.
// : 。
function createComparisonFunction(propertyName){
    return function (object1,object2) {
        var value1 = object1[propertyName];
        var value2 = object2[propertyName];
        if(value1value2){
            return 1;
        }else{
            return 0;
        }
    }
}

일반적으로 함수가 실행되면 로컬 활성 객체가 제거되고 메모리에는 글로벌 역할(전역 실행 환경의 변수 객체)만 저장됩니다.하지만 폐쇄 상황은 다르다.
var compare = createComparisonFunction("name");
var result = compare({name:"Wonder"},{name:"Greg"});

위 코드가 실행될 때, 익명 함수가createComparisonFunction () 에서 되돌아온 후, 그 역할 필드 체인은createComparisonFunction () 함수를 포함하는 활성 대상과 전역 변수 대상으로 초기화됩니다.이렇게 하면 익명 함수는createComparisonFunction()에 정의된 모든 변수에 접근할 수 있습니다.더 중요한 것은createComparisonFunction () 함수는 실행이 끝난 후에도 활동 대상이 삭제되지 않습니다. 익명 함수의 역할 체인이 여전히 이 활동 대상을 인용하고 있기 때문입니다.즉createComparisonFunction() 함수가 되돌아오면 실행 환경의 역할 체인은 삭제되지만 활성 대상은 메모리에 남아 있습니다.익명 함수가 삭제될 때까지createComparisonFunction () 의 활동팀은 삭제될 것입니다.
// 
var compare = createComparisonFunction("name");  
// 
var result = compare({name:"Wonder"},{name:"Greg"});
// ( 
compare = null;

패키지는 함수를 포함하는 작용역을 가지고 있기 때문에 다른 함수보다 더 많은 메모리를 차지합니다.패킷을 과도하게 사용하면 메모리가 너무 많이 차지할 수 있습니다.

패키지 닫기 및 변수


패키지를 닫으면 함수에 포함된 변수의 마지막 값만 얻을 수 있습니다.
function createFunctions() {
    var result = new Array();

    for (var i = 0; i < 10; i++) {
        result[i] = function () {
            return i;
        };
    }
    return result;
}
var re = createFunctions();
alert(re[0]());             //10

이 함수는 함수 그룹을 되돌려줍니다.표면적으로는 모든 함수가 자신의 색인 값을 되돌려야 하는 것 같지만, 실제로는 모든 함수가 10을 되돌려준다.모든 함수의 역할 체인에createFunctions () 함수의 활동 대상이 저장되어 있기 때문에 같은 변수 i를 참조합니다.createFunctions () 함수가 되돌아오면 변수 i의 값은 10입니다. 이 함수마다 저장된 변수 i의 같은 변수 대상을 인용하기 때문에 함수 내부 i의 값은 10입니다.
해결 방법: 다른 익명 함수를 만들어서 패키지를 닫는 행위가 예상에 부합하도록 합니다.
function createFunctions() {
    var result = new Array();

    for (var i = 0; i < 10; i++) {
        result[i] = function (num) {
            return function () {
                return num;
            };
        }(i);
    }
    return result;
}

var re = createFunctions();
alert(re[0]());

this 객체 정보


익명 함수의 실행 부분은 전역성을 가지기 때문에this 대상은 보통 윈도우를 가리킨다.
var name = "window";
 var object = {
     name:"object",
     getNameFunc: function () {
         return function () {
             return this.name;
         }
     }
 }

 alert(object.getNameFunc()());  //( )window


모든 함수는 호출될 때 두 개의 특수 변수를 자동으로 얻습니다:this와arguments.내부 함수는 이 두 변수를 검색할 때 활성 대상까지만 검색되기 때문에 외부 함수의 이 두 변수에 직접 접근할 수 없습니다.해결 방안: 외부 역할 영역의this 대상을 클러치가 접근할 수 있는 변수에 저장하면 클러치가 이 대상에 접근할 수 있습니다.
var name = "window";
var object = {
    name:"object",
    getNameFunc: function () {
        var that = this;
        return function () {
            return that.name;
        }
    }
}

alert(object.getNameFunc()()); //object

메모리 유출


IE9 이전 버전은 JScript 대상과COM 대상에 대해 서로 다른 쓰레기 회수 절차를 사용했기 때문에 IE의 이 버전에 패키지를 닫으면 특수한 문제가 발생할 수 있습니다.
닫힌 역할 도메인 체인에 HTML 요소가 저장되어 있으면 해당 요소가 제거되지 않습니다.
function assignHandler(){
     var element = document.getElementById("someElement");
     element.onclick = function(){
         alert(element.id);
     }
 }

솔루션:
function assignHandler(){
    var element = document.getElementById("someElement");
    var id = element.id;
    element.onclick = function(){
        alert(id);
    }
    element = null;
}

좋은 웹페이지 즐겨찾기