콜백 함수가 작동하는 데 문제가 있습니다.Javascript 콜백의 범위 지정 문제
SomeObject.prototype.refreshData = function()
{
var read_obj = new SomeAjaxCall("read_some_data", { }, this.readSuccess, this.readFail);
}
SomeObject.prototype.readSuccess = function(response)
{
this.data = response;
this.someList = [];
for (var i = 0; i < this.data.length; i++)
{
var systemData = this.data[i];
var system = new SomeSystem(systemData);
this.someList.push(system);
}
this.refreshList();
}
은 기본적으로 SomeAjaxCall는 데이터에 대한 아약스 요청을하고있다 : 여기 내 코드입니다. 작동한다면 우리는 콜백 'this.readSuccess'를 사용하고 실패하면 'this.readFail'을 사용합니다.
SomeObject.readSuccess의 'this'는 전역 콜백 (윈도우 개체라고도 함)입니다. 콜백이 함수가 아니라 멤버 메서드로 호출되기 때문입니다. 내 이해는 내가 주변에 '이것'을 유지하기 위해 폐쇄를 사용해야하지만, 나는 이것을 작동시킬 수 없었다.
누군가 내가 할 수있는 것을 보여줄 수 있다면 나는 그것을 크게 고맙게 여길 것입니다. 나는 아직도 폐쇄가 작동하는 방법과 특히이 상황에서 어떻게 작동 할 것인가에 관해 머리 글자를 쓰고있다.
감사합니다.
SomeObject.prototype.refreshData = function()
{
var obj = this;
var read_obj = new SomeAjaxCall("read_some_data", { },
function() { obj.readSuccess(); }, function() { obj.readFail(); });
}
일부 자바 스크립트 프레임 워크 유틸리티에 "바인딩"개체에 대한 기능, 단순히 수단을 제공 할 수
, 여기서 일어나는 것은'obj'가 'function() {obj.readSuccess(); }'평가됩니다. Prototype이나 jQuery와 같은 라이브러리를 사용하지 않는 한 다른 방법은 없습니다. 이것들은 투명하게 클로저 생성을 할'.bind()'함수를 가지고있다. – MvanGeest
nit-pick을 사용하지는 않지만 StackOverflow를 사용하기 위해서는 jQuery 버전을 "bind"가 아닌 "proxy"라고 부릅니다. – Pointy
완벽한 의미가 있습니다. jQuery 프록시 함수가 작동합니다. 그러나 완벽을 기하기 위해 jQuery를 사용하지 않으면 어떻게 처리 할 것인지 혼란 스럽습니다. 필자의 예제에서 readSuccess는 나중에 채워지는 respnse라는 하나의 인수를가집니다. 그래서 그것은 function() {obj.readSuccess (wah ??); } 와우 이후 ?? 나중에 전달 될 예정입니다. 시도해 보았습니다. function() {obj.readSuccess; } 행운을 빌어 요. 이견있는 사람? – nazbot