Javascript变量范围

时间:2011-03-29 14:36:20

标签: javascript variables

我正在尝试使用js& amp; jquery但是我不能让它工作。

根据我的理解,当我声明一个没有var的变量时,它变为全局但我可以将一个变量从jquery回调传递给我的main函数。

   function fetchEvents(start,end){
        ret = [];
        $j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,function(data){
            console.log(data); // works ok
            ret = data;
        });
        console.log(ret); // equals [] :'(
        return ret;
    }

7 个答案:

答案 0 :(得分:2)

  

据我所知,当我用var声明变量时,它变成了全局..

反之亦然。省略var时,变量变为全局变量。始终使用var!

来自Google JavaScript Style Guide

  

如果你没有指定var,那么   变量放在全局中   背景,潜在的破坏   现有价值观。另外,如果没有   声明,很难说清楚   一个变量的范围(例如,它可以   就像在文档或窗口中一样   很容易在本地范围内)。所以   总是用var。

声明

关于console.log(ret); // equals [] :'(的问题......

$j.getJSON()不是同步方法调用。该方法以异步方式运行,因此您的代码有效地说:

ret = [];
console.log(ret);

如果你需要在执行后使用getJSON()返回的数据,你可以在回调函数中调用一个方法:

$j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,
    function(data){      // this is your callback function
      console.log(data); // works ok
      doSomething(data); // process the returned JSON
    }
});

答案 1 :(得分:2)

你的问题是$ .getJSON使用了一个回调,所以当你的fetchEvents函数被调用时,它会在回调执行之前返回。

你想要做的是在回调中填充/做你想做的事情。

正如您所指出的,console.log在回调中正常工作

答案 2 :(得分:1)

好像你在这里混淆了两个问题。

首先,var不会产生变量。反之亦然。省略var将使变量成为全局变量。

第二个是getJSON回调方法不同步执行。一旦http请求完成,它将执行。因此,在进行ret调用后,不会期望getJSON会立即设置为该值。

答案 3 :(得分:0)

尝试将var添加到var ret = [];

答案 4 :(得分:0)

将var添加到它不会使其成为全局,省略它使其全局,它将被添加到全局窗口对象。

答案 5 :(得分:0)

那是因为在得到ajax的回复之前会对ret进行评估。试试

function fetchEvents(start,end){
        $j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,function(data){
            console.log(data); // works ok
            var ret = data
            whatsRet (ret);
        });
        }

function whatsRet (ret) {
        console.log(ret); // equals data :)
}

答案 6 :(得分:0)

您遇到的问题是编写异步代码。

当您调用getJSON时,在getJSON返回某些内容之前,不会调用内部函数。这意味着代码不再自上而下执行,即使getJSON仍在获取数据,您的程序也会继续执行。

您应该提供callback而不是return

var fetchEvents = function (start, end, callback) {
  $j.getJSON("index.php?start="+start+"&end="+end, function (data) {
    callback(data);
  });
};

// Now you can use fetchEvents which will be asynchronous too
fetchEvents(0, 10, function (data) {
  console.log(data);
})

您可以将fetchEvents直接传递给callback来简化getJSON事件。

var fetchEvents = function (start, end, callback) {
  $j.getJSON("index.php?start="+start+"&end="+end, callback);
};

PD:我简化了查询的可读性。