如何使JavaScript属性全局化?
请参考下面的示例代码如何使JavaScript属性全局化?,javascript,scope,callback,Javascript,Scope,Callback,请参考下面的示例代码 var report = { chartTypes : null, init: function () { this.getChartTypes(function(data){ this.chartTypes = data; }); }, getChartTypes: function(callback) { $.ajax({ data:'',
var report = {
chartTypes : null,
init: function () {
this.getChartTypes(function(data){
this.chartTypes = data;
});
},
getChartTypes: function(callback) {
$.ajax({
data:'',
url:'',
success:function(response){
chartTypes = JSON.parse(response);
callback(chartTypes);
}
});
},
getToolbar:function() {
this.chartTypes --------------- NULL
}
}
getChartTypes
函数通过AJAX加载不同的图表类型。因此我把它作为一个回调函数。数据接收成功。但是当我在另一个函数中使用this.chartTypes
时,比如getToolbar
它会说this.chartTypes
是null
。甚至我在开始时也初始化了相同的。可能是范围问题。请告知。您正在分配一个名为chartTypes
的变量(可能是全局变量),但这与reoprt.chartTypes
不同。您需要分配给this.chartTypes
,但匿名函数中的this
与它外部的this
不同,因此您需要使用另一个变量记住该值:
getChartTypes: function(callback) {
var self = this;
$.ajax({
data:'',
url:'',
success:function(response){
callback( self.chartTypes = JSON.parse(response) );
}
});
}
使用OOP方法,大多数开发人员都会使用一个方法,并在触发异步成功方法时使用
.bind()
来维护适当的范围。这样,您就不必担心闭包和使用变量来保持This
的作用域
var report = {
chartTypes : null,
init: function () {
this.getChartTypes();
},
getChartTypes : function(callback) {
$.ajax({
data:'',
url:''
}).done(this._setSuccessResponse.bind(this));
},
_setSuccessResponse : function(data){
this.chartTypes = data;
},
getToolbar : function() {
console.log(this.chartTypes);
}
}
您还需要确保在调用
getToolbar
时,Ajax调用也已完成 这在这里已经得到了回答:@NeilMunro这主要不是一个作用域问题-这是一个异步问题您似乎在AJAX成功回调中为chartTypes
变量赋值。因此,在调用读取此变量的getToolbar
函数之前,您应该确保已调用getChartTypes
函数,并且AJAX请求已成功执行。它既不是作用域也不是异步的(尽管可能存在其他异步问题)this.chartTypes
只是没有引用全局变量chartTypes
@Alnitak-可能我们看不到这两个函数是如何相互调用的。它似乎在工作。但是getToolbar函数是从两个地方调用的。chartTypes首次包含预期值。但它同样是空的。我们如何使它成为全局的,这样它就不会变成空的。@manashb也许你也有异步问题。您是否在Ajax响应返回之前调用getToolbar
,比如report.getChartTypes();report.getToolbar()代码>,将返回null,因为Ajax回调尚未执行。不存在异步问题。只有在AJAX响应返回后才会调用getToolbar。但是AJAX函数只被调用一次,getToolbar函数被调用两次。第一次chartType不是空的,但第二次它是空的。@manashb然后必须有其他东西将其设置回null。设置后,除非重新分配新值,否则不会更改。您的报告
对象是否仍在范围内?(console.log(报告);
)已解决。谢谢你的回复。这真的很有帮助