2011-03-29 101 views
0

我试图做一个简单的功能与js & jquery,但我无法得到它的工作。Javascript可变范围

从我所了解的情况来看,当我声明一个没有var的变量时,它变成了全局变量,但我可以将一个变量从jquery回调函数传递给我的主函数。

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; 
    } 
+0

你可能想阅读javascript async – kjy112 2011-03-29 14:40:44

+0

ret变量是否需要数组? – yojimbo87 2011-03-29 14:41:38

回答

2

据我了解,当我声明一个变量使用var成为全球..

情况正好相反。当您省略var时,变量将变为全局变量。始终使用var!

Google JavaScript Style Guide

当你失败指定变种,该 变量被放置在全球背景下 ,可能重挫 现有值。另外,如果不存在 声明,很难说明变量存在的范围(例如,它可能容易地在文档或窗口中,就像 ,就像在本地范围中一样)。所以 总是用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 
    } 
}); 
+0

那不告诉我如何修复我的脚本... – 2011-03-29 14:40:44

+0

@Paté创建一个全局函数调用'test()'并在该函数内调用'console.log(ret)'现在在你的getJSON回调函数中调用'test()'并且看看你得到了什么 – kjy112 2011-03-29 14:42:59

+0

@Paté - 我添加了一个代码示例来演示如何使用返回的数据。 – McStretch 2011-03-29 14:49:54

0

尝试加入VAR到var ret = [];

+0

它并没有改变任何东西... – 2011-03-29 14:39:40

+0

@pate你需要让你请求async:false – jimy 2011-03-29 14:42:51

+0

需要使用'.ajax'而不是'.getJSON'来设置'async:false' – kjy112 2011-03-29 14:47:16

0

向其添加var不会使其成为全局变量,省略它会使其成为全局变量,并将其添加到全局窗口对象中。

2

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

你想要做的是在回调填充/做你想做的东西。

正如你所指出的console.log回调

1

工作正常好像你在这里混淆2点的问题。

第一个是var没有使变量gloabl。事实恰恰相反。这是省略var将使全局变量。

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

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 :) 
} 
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); 
}) 

可以simpify fetchEvents事件更直接的传递给callbackgetJSON

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

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