如何使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(报告);
)已解决。谢谢你的回复。这真的很有帮助