在jQuery函数之外获取JSON响应var?

时间:2012-02-14 23:58:37

标签: jquery json variables var

我有以下jQuery函数:

function deleteHype(){
    FB.api('/me/launchhype:hype', function(response) {
            $.each(response.data, function(i, obj){
                    if (obj.data.launch.url == '<?php the_permalink(); ?>') {
                            var delete_launch_id = parentObj=obj.id;
                    }
            });
    });
}
alert(delete_launch_id);

让我们在IF语句中说var“delete_launch_id”是“X”。好吧,如果我尝试在函数外部执行警告“delete_launch_id”,它将是“未定义”。我希望它能给我回“X”(假设的价值)。

我该怎么做?我迷路了,似乎找不到类似的例子。

4 个答案:

答案 0 :(得分:1)

根据大众需求,这里更深入地了解为什么变量“delete_launch_id”在“警报”功能访问时无法使用。

有几件事正在发生。

首先,FB.api函数很可能是异步AJAX调用。 JavaScript并不是真正的异步(但是),但在这种情况下,它实际上是有效的。这意味着当异步代码执行时,异步代码等待响应后,代码将继续执行。因此,如果您调用“deleteHype”,然后紧跟其后“alert”,则很有可能在调用“alert”时不会返回FB.api响应。因此,异步代码中设置的任何内容都将无法使用。

第二个问题是JavaScript具有“功能范围”。在实践中,这意味着函数内定义的变量仅在该函数内可用。它只在该函数中具有“范围”。请考虑以下代码:

var foo = 1;
if(1 === 1) {
    // non-function block. foo is accessible in here, and any changes to foo will be seen outside this block.
    foo = 2;
}
// foo is 2

function change() {
    // functional scope. variables defined in here are only available here
    foo = 3;
    var bar = 1;
}

// foo is 2 because we haven't called change yet
// bar is "undefined"

change();

// foo is 3
// bar is "undefined"

“foo”已更改,因为它在函数外部具有范围,因此该函数可以访问它。 但是,“bar”只在该函数内部具有范围,并且在其他任何地方都不存在。

在原始示例中,“delete_launch_id”在几个函数中声明,实际上,因此在其他任何地方都不可用。

我的第一个答案通过将一个函数作为“回调函数”传递给“deleteType”函数来解决这些问题,只有当异步代码完成并返回时才会调用它。这处理问题#1。然后回调函数传递给它“delete_launch_id”,这使它可用。我给出的格式可能看起来有点奇怪:

deleteHype(function(delete_launch_id) {
    // alert
});

这里发生的是我们实际上将一个函数作为变量传递。这是一个“匿名”功能(没有名字)。所以deleteType treats就像一个变量(因为它是),并且可以调用它,因为它是一个函数,它内部的代码将在调用时执行。这是一个非常方便的模式。

我希望有所帮助。起初这是令人困惑的事情。

答案 1 :(得分:0)

将变量声明为全局变量(或者在任何需要的地方都可以访问命名空间)。

问题是,一旦你这样做,你需要担心它何时被访问,以及当时访问它是否合理。更好的解决方案取决于您实际要做的事情。

但是,一般情况下,最好将这种异步内容保持为本地,并使用函数来操作回调中的状态。例如,您可以将函数传递给使用ID执行“正确”操作的deleteHype,在回调中执行工作,从回调或传递给它的函数操作DOM等等。

答案 2 :(得分:0)

我不会理解为什么你不能在代码中“看到”delete_launch_id的所有原因,但也许这样的东西会起作用?:

function deleteHype(callback){
    FB.api('/me/launchhype:hype', function(response) {
            $.each(response.data, function(i, obj){
                    if (obj.data.launch.url == '<?php the_permalink(); ?>') {
                            if(typeof callback === 'function') {
                               callback(obj.id);
                            }
                    }
            });
    });
}

deleteHype(function(delete_launch_id) {
    alert(delete_launch_id);
});

答案 3 :(得分:0)

您需要做的是将变量作为两个函数之间的参数传递。

function deleteHype(){
  FB.api('/me/launchhype:hype', function(response) {
    $.each(response.data, function(i, obj){
      if (obj.data.launch.url == '<?php the_permalink(); ?>') {
        var delete_launch_id = parentObj=obj.id;
      }
    });
  });
}
function grabID(delete_launch_id){
  alert(delete_launch_id);
}

你的第一个功能是完全正确的。现在你只需要第二个函数来获取参数并输出它;如下。

function grabID(delete_launch_id){
  alert(delete_launch_id);
}

现在您可以在需要输出delete_launch_id的地方使用grabId。