函数之间的Jquery和全局变量范围问题

时间:2015-08-24 13:29:33

标签: javascript jquery

我有以下代码:

$(document).ready(function () {

            var english = "";
            var spanish = "";

            $.get("./gamelist-english.txt",function(data){
                english = data;
                });

            $.get("./gamelist-spanish.txt",function(data){
                spanish = data;
                });

        $('#compare').mergely({
            cmsettings: { readOnly: true, lineNumbers: true },
            lhs: function(setValue) {
                setValue(english);
            },
            rhs: function(setValue) {
                setValue(spanish);
            }
        });

    });

(顺便说一句,我在这里使用合并库,但我认为这不重要)

我遇到的问题是,“西班牙语”和“英语”两个变量都不是全局的,所以$('#compare')。mergely无法得到它们的值(它说它们都是空的,但是这不是真的)。我怎样才能解决这个问题?我认为通过在任何函数之外声明任何变量,它们会自动变为全局变量,但显然它不起作用,或者我有点迷失。

非常感谢。

1 个答案:

答案 0 :(得分:2)

它们不是全局的事实不是问题。你有它们的范围很好。

问题是,您在之前调用mergely 这些变量中包含值,因为ajax是异步。相反,等待调用完成:

$(document).ready(function () {
    var english = "";
    var spanish = "";

    $.when(
        $.get("./gamelist-english.txt",function(data){
            english = data;
        }),
        $.get("./gamelist-spanish.txt",function(data){
            spanish = data;
        })
    ).then(function() {
        $('#compare').mergely({
            cmsettings: { readOnly: true, lineNumbers: true },
            lhs: function(setValue) {
                setValue(english);
            },
            rhs: function(setValue) {
                setValue(spanish);
            }
        });
    });
});

但是,您可以完全避免使用这些变量,因为当您使用$.when时,回调会从两个承诺中获取值;请注意,因为它是$.get,所以该值是一个数组,数据作为数组中的第一项。

$(document).ready(function () {
    $.when(
        $.get("./gamelist-english.txt"),
        $.get("./gamelist-spanish.txt")
    ).then(function(english, spanish) {
        $('#compare').mergely({
            cmsettings: { readOnly: true, lineNumbers: true },
            lhs: function(setValue) {
                setValue(english[0]); // <== Note the [0]
            },
            rhs: function(setValue) {
                setValue(spanish[0]); // <== Note the [0]
            }
        });
    });
});