2011-01-18 2 views
1

"this"를 사용하여 Object 함수에 액세스하는 데 문제가 있습니다. 아래 예제 (여러 가지 이유로 실제 코드를 제공 할 수 없기 때문에 단순화 됨)의 경우 createList()를 호출 할 때 this._getEntry() 함수 호출이 "정의되지 않음"입니다."this"를 사용하여 javascript dojo closure에서 함수가 사용되었습니다. -notation이 정의되지 않았습니다.

나는 이것에 대한 의견이 있으니 자바 스크립트 클로저 오해 또는 오히려 구문 오류에 대한 오해가 있기를 바랍니다.

후자의 경우 실제 코드에서 오류를 직접 찾아야합니다.

자바 스크립트 또는 도우미 개념에 대한 오해가 있다면 올바르게 범위를 지정하고 아래에서 언급 한 함수 (_getEntry())에 액세스하는 방법에 대한 도움을 주시면 감사하겠습니다.

var OBJECT = { 
    _getEntry : function(entry){ 
    var li = document.createElement('LI'); 
    li.appendChild(document.createTextNode(entry)); 
    return li; 
    }, 
    createList : function(entryArray){ 
    var list = document.createElement('UL'); 
    dojo.forEach(entryArray,function(entry){ 
     list.appendChild(this._getEntry(entry)); 
    }); 
    dojo.body().appendChild(list); 
    } 
}; 
OBJECT.createList(["entry1","entry2"]); 

감사합니다!

+0

); added afterEach – elfwyn

답변

3

에서 얻을 폐쇄를 사용하는 것입니다

createList : function(entryArray){ 
    var list = document.createElement('UL'); 
    dojo.forEach(entryArray,function(entry){ 
     list.appendChild(this._getEntry(entry)); 
    }, this); 

    dojo.body().appendChild(list); 
    } 

을, 당신 붙여 넣은 코드는 forEach을 완료 ); 누락 생각 .

둘째, forEach은 전달 된 함수가 실행되는 컨텍스트를 결정하는 선택적 제 3 매개 변수를 취합니다. 지정하지 않으면 전역 범위가 기본값이되므로 네 문제입니다. this 가정하면 이미 예를 들어, 당신이 바로 forEach 외부, 당신은 단지 forEach에 세 번째 인수로 this을 통과 할 수 있어야 할 필요가 무엇을 의미하고 그것은 작동합니다 :

자세한 내용은
dojo.forEach(entryArray, function(entry){ 
    list.appendChild(this._getEntry(entry)); 
}, this); 

: http://dojotoolkit.org/api/dojo/forEach - JS 1.6의 API를 기반으로합니다. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach

1

이것은 일반적인 문제이며 여러분이 옳은 것입니다. 범위 지정 및 종료에 관한 것입니다. 여기서 일어나는 일은 forEach 컨텍스트가 글로벌 컨텍스트 (window)로 변경되면 얻을 수 있습니다. 솜씨, 도장이 컨텍스트 설정하는 방법을 제공하는 또 다른 방법은 첫째 this

createList : function(entryArray){ 
    var list = document.createElement('UL'); 
    var _this = this; // closure allowing the forEach callback access to this 
         // some popular variable names used for this include: 
         // $this, _this, me and that 
    dojo.forEach(entryArray,function(entry){ 
     list.appendChild(_this._getEntry(entry)); 
    }); 

    dojo.body().appendChild(list); 
    } 
+0

문맥은 'dojo.forEach'에 대한 세 번째 매개 변수로 명시 적으로 제공되지 않으면 전역 객체로 기본 설정됩니다.이 문제를 해결하는 다른 방법이 될 수 있습니다. –

+0

dojo의 설명서를보고 매개 변수를 보지 못했습니다. 좀 더 가깝게 보일 것입니다. – Hemlock

관련 문제