下面是一个代码大大简化片断从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