下面是一個代碼大大簡化片斷從SlickGrid樣品衍生自:很困惑有關JavaScript作用域
model.js:
(function($) {
function RemoteModel() {
var someArr=[0];
var someVar=0;
var onDataLoadedSuccess = new Slick.Event();
function ensureData(from, to) {
h_request = setTimeout(function() {
req = $.ajax({
url: url,
context: this,
success: function(resp) {
onSuccess();
}
});
}, 3000);
}
function onSuccess() {
someVar=someVar+100;
someArr[0]=someArr[0]+100;
console.log(someVar + " " + someArr[0]); // yes values are changing properly for both !
onDataLoadedSuccess.notify({ from: from, to: to });
}
return {
"someArr": someArr,
"someVar": someVar,
"onDataLoadedSuccess": onDataLoadedSuccess,
};
}
})(jQuery);
main.js:
var loader=new RemoteModel();
var grid=new Slick.Grid("#wlGrid", loader.data, columns, options);
grid.onViewportChanged.subscribe(function(e, args) {
var vp = grid.getViewport();
loader.ensureData(vp.top, vp.bottom);
});
loader.onDataLoadedSuccess.subscribe(function(e, args) {
// someVar is always 0 :(! someArr[0] is changing fine .. why ???
console.log(loader.someVar + " " + loader.someArr[0]);
});
因此,網格上的事件(onViewportChanged
)在m上調用ensureData
odel,其中 增量爲someVar
和someArr[0]
,兩者均由RemoteModel
的返回值 公開。
遞增活動結束後,onDataLoadedSuccess
由模型中的事件只有loader.someArr[0]
值已改變內然而 觸發。
爲什麼someVar
的值在onDataLoadedSuccess
總是零?這是範圍問題嗎? 爲什麼someArr[0]
的值改變正常?
我該如何正確讀取onDataLoadedSuccess
中someVar
的值?
OK,我認爲我明白現在發生了什麼,謝謝大家! 但是,我如何使一些變量工作?我需要讓構造函數返回一個對象(因爲這裏有很多方法),但我仍然希望允許thisVar可以從ensureData,onSuccess和onDataLoadedSuccess訪問? – kofifus