首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript变量作用域

Javascript变量作用域
EN

Stack Overflow用户
提问于 2011-03-29 22:36:20
回答 7查看 245关注 0票数 0

我试着用js & jquery创建一个简单的函数,但是我不能让它工作。

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

代码语言:javascript
复制
   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;
    }
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-29 22:38:56

据我所知,当我用

声明一个变量时,它就变成了全局变量。

事实恰恰相反。如果省略var,该变量将变为全局变量。始终使用var!

Google JavaScript Style Guide

当您没有指定var时,变量会被放在全局上下文中,这可能会破坏现有的值。此外,如果没有声明,就很难判断变量位于哪个作用域中(例如,它可能位于文档或窗口中,就像在本地作用域中一样容易)。所以一定要用var来声明。

至于你对console.log(ret); // equals [] :'(的问题。

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

代码语言:javascript
复制
ret = [];
console.log(ret);

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

代码语言:javascript
复制
$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
    }
});
票数 2
EN

Stack Overflow用户

发布于 2011-03-29 22:45:38

您的问题是$.getJSON使用回调,因此当您的fetchEvents函数被调用时,它在回调执行之前返回。

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-03-29 22:45:47

看起来你在这里混淆了两个问题。

第一个是var不会创建一个变量gloabl。事实恰恰相反。也就是说,省略var将使变量成为全局变量。

第二个问题是getJSON回调方法不能同步执行。它将在http请求完成后执行。因此,不需要在调用getJSON之后立即将ret设置为该值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5474271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档