Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript全局变量和jQuery的奇怪行为_Javascript_Jquery - Fatal编程技术网

javascript全局变量和jQuery的奇怪行为

javascript全局变量和jQuery的奇怪行为,javascript,jquery,Javascript,Jquery,可能重复: 首先,我对JS或jQuery不是很有经验,但就我的编程技能而言,我似乎找不到我的方法有任何错误 var subtree; $.post("addTreeServlet", { term:clickedNode, max:maxId, id:clickedId }, function(jsonResponse){ subtree = eval('(' + jsonResponse + ')')

可能重复:

首先,我对JS或jQuery不是很有经验,但就我的编程技能而言,我似乎找不到我的方法有任何错误

var subtree;

$.post("addTreeServlet",
    {
        term:clickedNode,
        max:maxId,
        id:clickedId
    },
    function(jsonResponse){

        subtree = eval('(' + jsonResponse + ')');

    }
);

$jit.json.prune(subtree, level);
return {
     'id': nodeId,
     'children': subtree.children
};
我用调试器检查了代码,下面是发生的情况:程序从addTreeServlet返回并传输表示JSON数据的字符串。函数的作用是:获取该字符串并将其转换为JSON对象(同样,它在调试器中看起来非常好)。但是,一旦我离开函数(jsonResponse),var子树就会显示为未定义,我不知道为什么

这是因为jQuery方法吗?我不知道


如果我只是把subtree=“whatever”放进去,这也是同样的行为。一旦我退出函数,它就会变得未定义。

它正在等待post响应,但您的空闲脚本会立即被浏览器解析。所以,在收到post响应之后,您需要对ajax响应执行您想要执行的操作

function(jsonResponse){
    var subtree = eval('(' + jsonResponse + ')');
    doSomthingWithResponse(subtree);
}

问题是$.post异步为您执行此任务,而$.post下的代码在返回调用之前执行。。。您可以将$.ajax与同步调用一起使用

 var subtree;
        $.ajax({
            type: 'POST',
            url: "addTreeServlet",
            data: {
                term: clickedNode,
                max: maxId,
                id: clickedId
            },
            success: function (jsonResponse) {

                subtree = eval('(' + jsonResponse + ')');

            },
            async: false
        });

        $jit.json.prune(subtree, level);
        return {
             'id': nodeId,
             'children': subtree.children
        };

这并不奇怪,这是尝试使用异步代码获得同步结果的结果。您不能在
$.post
回调函数之外访问
子树。此函数背后的逻辑需要以不需要返回数据的方式重新执行。不要使用
eval
jQuery将为您安全地解析JSON。因为
函数(jsonRepsonse)
在设置
子树
的函数之前执行“after”代码。这是来自异步代码的回调。在javascript中它不一定是自顶向下的。。。这个函数的标准副本是什么?
function(jsonResponse){
是一个回调函数,请参阅:是的,thx,我的问题现在得到了回答。我只是将回调设置为同步。这对我的情况有效,因为发送/接收和显示数据之间的动画相对较长。