【问题标题】:Get JSON response var outside of jQuery function?在 jQuery 函数之外获取 JSON 响应变量?
【发布时间】:2012-03-06 08:40:37
【问题描述】:

我有以下 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”(设定的假设值)。

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

【问题讨论】:

    标签: jquery json variables var


    【解决方案1】:

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

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

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

    【讨论】:

    • 就个人而言,我永远不会鼓励初学者将变量实际放在全局范围内。这是一个你不想养成的坏习惯。
    • @reedlauber 这就是为什么不止第一句话。然而,这是一种实现他们想要的实际方法(以我的其余答案为模),并不总是人们想象的那样恐怖。它是一个工具,就像其他任何东西一样——它可以被滥用,但并不总是明确的“错误”。此外,初学者所知道的、可以做的并且仍然能够调试它是有限度的。
    • 你不能声明一个全局变量,修改一个函数内部的变量,然后将该变量传递给另一个函数而不将变量作为参数传递。
    • @Ohgodwhy 不太确定你说了什么,或者它与答案或 cmets 有什么关系。你根本不需要传递一个全局变量——它是全局变量。这就是为什么它是危险的和不明智的。
    【解决方案2】:

    我不会详细说明为什么您在代码中无法“看到”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);
    });
    

    【讨论】:

    • 我认为“了解”为什么你在代码中看不到 delete_launch_id 的所有原因正是 OP 需要能够理解底层技术而不是被灌输代码。教人钓鱼……
    • 我同意,但功能范围、闭包和异步代码是相当大的话题。下次……
    • 这似乎没有任何作用?郑重声明,我确实同意 Paolo,我知道这可能难以解释,但请知道我不一定要寻找一个简单的答案。它也有助于了解正在发生的事情! :)
    • 很公平。我将添加另一个答案并进行更深入的解释。
    • 我真的很感激。两者都有帮助。一个例子来看看正确的方法是什么,并稍微解释一下,以便我掌握以备后用! :)
    【解决方案3】:

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

    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。

    【讨论】:

    • 我不确定我把你给我的这个新功能放在哪里了?你能给我一个例子吗?谢谢!
    【解决方案4】:

    根据大众的需求,这里更深入地了解为什么变量“delete_launch_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_launch_id”传递给它,使其可用。我给出的格式可能有点奇怪:

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

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

    我希望这会有所帮助。起初这很令人困惑。

    【讨论】:

    • 你摇滚。非常感谢这个解释。更有意义。
    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多