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

在jQuery函数之外获取JSON响应变量?,jquery,json,variables,var,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(); ?>') {

我有以下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);
函数deleteHype(){
api('/me/launchhype:hype',函数(响应){
$.each(response.data,function(i,obj){
如果(obj.data.launch.url=''){
var delete_launch_id=parentObj=obj.id;
}
});
});
}
警报(删除启动id);
假设在IF语句中,变量“delete\u launch\u id”是“X”。如果我尝试在函数外执行“delete_launch_id”警报,它是“undefined”。我希望它返回“X”(设定的假设值)


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

将变量声明为全局变量(或在需要时可以访问的命名空间中)

问题是,一旦你这样做了,你需要担心什么时候访问它,以及在那个时候访问它是否合理。更好的解决方案取决于你实际想做什么


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

将变量声明为全局变量(或在需要时可以访问的命名空间中)

问题是,一旦你这样做了,你需要担心什么时候访问它,以及在那个时候访问它是否合理。更好的解决方案取决于你实际想做什么


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

我不想解释为什么您无法在代码中的该点“看到”delete\u launch\u 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);
});
函数deleteHype(回调){
api('/me/launchhype:hype',函数(响应){
$.each(response.data,function(i,obj){
如果(obj.data.launch.url=''){
if(回调类型==='function'){
回调(对象id);
}
}
});
});
}
deleteHype(功能(删除启动id){
警报(删除启动id);
});

我不会详细解释为什么您无法在代码中的该点“查看”删除\u launch\u 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);
});
函数deleteHype(回调){
api('/me/launchhype:hype',函数(响应){
$.each(response.data,function(i,obj){
如果(obj.data.launch.url=''){
if(回调类型==='function'){
回调(对象id);
}
}
});
});
}
deleteHype(功能(删除启动id){
警报(删除启动id);
});

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

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

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

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

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

现在,您可以在需要输出delete\u launch\u id的地方使用grabId。

根据流行的需求,这里将更深入地了解为什么变量“delete\u launch\u id”在“alert”函数访问时不可用

有几件事正在发生

首先,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\u launch\u id”传递给它,从而使其可用。我给出的格式可能有点奇怪:

deleteHype(function(delete_launch_id) {
    // alert
});
这里的情况是,我们实际上是把一个函数作为变量传递。这是一个“匿名”函数(没有名字)。所以deleteType treats就像一个变量(因为它是),并且可以调用它,因为它是一个函数,当调用它时,其中的代码将执行。这是一个非常方便的模式


我希望这有点帮助。首先,这是一个令人困惑的问题。

根据流行的需求,这里更深入地分析了为什么变量“delete\u launch\u id”在“alert”函数访问时不可用

有几件事正在发生

首先,FB.api函数很可能是一个异步AJAX调用。JavaScript还不是真正的异步,但在本例中,它有效地