需要从ajax调用设置全局变量

时间:2014-02-19 20:00:38

标签: javascript

我从ajax调用中收到一个值,我需要将这些变量用于其他函数。我在设置全局变量时遇到了一些困难。基于另一个SO问题,我认为将变量传递给SUCCESS上的另一个函数会将值放在全局范围内,但这不起作用。

success: function (json) {
    var xCoord = json.features[0].geometry.x;
    var yCoord = json.features[0].geometry.y;
    var xyCoord = json.features[0].geometry;
    setXY(xCoord,yCoord,xyCoord);
},

function setXY(x,y,geometry){
    var xCoord = x;
    var yCoord = y; 
    var xyCoord = geometry
}

我怎样才能完成这个看似简单的任务?

4 个答案:

答案 0 :(得分:1)

在父作用域中声明变量,然后在成功函数中为它们赋值。

var xCoord, yCoord, xyCoord;

...

success: function (json) {
    xCoord = json.features[0].geometry.x;
    yCoord = json.features[0].geometry.y;
    xyCoord = json.features[0].geometry;
},

现在,父作用域中的所有函数都可以访问这些变量。

答案 1 :(得分:1)

您可以使用窗口对象

window.userdata = {};

function setXY(x,y,geometry){
    window.userdata.xCoord = x;
    window.userdata.yCoord = y; 
    window.userdata.xyCoord = geometry;
}

如果您愿意,可以使用全局对象:

var userdata = {};    
function setXY(x,y,geometry){
    userdata.xCoord = x;
    userdata.yCoord = y; 
    userdata.xyCoord = geometry;
}

答案 2 :(得分:0)

使用关键字var时,在本地范围内声明变量。如果你在一个函数中,那么该变量只能从它内部访问。

您可以在全局范围内声明变量,也可以通过窗口访问全局范围:

var global1 = true;

function setXY(x,y,geometry){
    global1; //return true
    window.global1; //true also
    window.global2 = 3;
    global3 = 5; // If you use no var keyword, it also points to the global scope.
} 

答案 3 :(得分:0)

您可以使用window对象来设置全局变量:

function setXY(x,y,geometry){
    window.xCoord = x;
    window.yCoord = y; 
    window.xyCoord = geometry
}

但这不是一个非常好的做法。您应该将应用程序命名为命名空间,以避免混淆全局命名空间,以及与您可能希望将来包含的其他库的潜在冲突。

有很多方法可以解决这个问题。

最简单的方法是在全局命名空间中定义一个可以将所有其他变量保存在离散对象中的单个对象:

var myData;
function setXY(x,y,geometry){
        myData.xCoord = x;
        myData.yCoord = y; 
        myData.xyCoord = geometry
 }

另一种方法是使用closures。通过这种方式,您可以将代码块封装在全局空间之外。

(function() {
   var myVar;
   function mySuccess(data) {
     myVar = data;
     $.ajax({ url: 'test.com', success: mySuccess});
   }
})()

通过这种方式,闭包内的所有代码都可以访问myVar,但您并没有不必要地添加到全局命名空间。

另一种方法是使用对象。

var Ajaxer = function(){

};
Axazer.prototype.setData = function(data) {
   this.data = data;
}
Azaxer.prototype.doAjax = function() {
   var self = this;
   $.ajax({ url: 'test.com', success:function(data){self.setData(data);});
}


var myAjxer = new Ajaxer();
myAjaxer.doAjax();

这种方式可以说是最有用的,因为它允许你维护离散的类,你可以传递和交互。