Javascript 如何跨函数使用和重用JS变量

Javascript 如何跨函数使用和重用JS变量,javascript,jquery,html,Javascript,Jquery,Html,我的情况是,我需要根据jQuery AJAX调用的结果初始化/分配变量,然后在脚本中进一步重用这些变量: var shouldRedirect = ??? $.ajax({ url: 'http://example.com', type: 'GET', data: 'blah', asynch: false, timeout: 1800, success: function(data) { shouldRedirect = dat

我的情况是,我需要根据jQuery AJAX调用的结果初始化/分配变量,然后在脚本中进一步重用这些变量:

var shouldRedirect = ???

$.ajax({
    url: 'http://example.com',
    type: 'GET',
    data: 'blah',
    asynch: false,
    timeout: 1800,
    success: function(data) {
        shouldRedirect = data.rows[0].redirectFlag
    }
});

if(shouldRedirect)
    window.location = "...";
我有两个问题:

  • 假设生成的JSON将包含一个
    redirectFlag
    boolean,即
    data.rows[0]。redirectFlag
    获取我的变量值的正确方法是什么?;及
  • 在AJAX启动之前,初始化
    应该重定向到什么位置(如何说“创建一个变量,但不要给它赋值!”)

提前谢谢

只需执行以下操作,即可声明未初始化的变量:

var shouldRedirect;
如果您的逻辑需要,您当然可以将其初始化为false:

var shouldRedirect = false;
这可能不是你想要的。通过将变量与未定义的
进行严格比较,可以检查变量是否已初始化:

if (shouldRedirect === undefined) // do something
但是请注意,必须使用三重相等运算符(也称为严格相等),否则结果将不符合预期。另一方面,未定义的变量将产生错误的结果。这意味着,当使用简单的
if(shouldRedirect)
检查变量时,如果该变量未定义,那么它将产生
false
,就像它被设置为false一样。JavaScript中的一些其他值也是如此,例如空字符串
“”
或值
null
。您可以看到falsy值的完整列表。如果要显式检查true或false,并且要忽略其他falsy或truthy值,则应使用三重相等进行检查,例如
If(shouldRedirect==true)

另外,如果
data.rows[0].redirectFlag
是访问该值的正确方法,则该值在很大程度上取决于从AJAX调用接收的数据结构的实际外观。如果类似于以下内容,则是正确的:

{ rows: [ {redirectFlag: true}, {redirectFlag: false} ] }
如果您的JSON看起来像下面这样

{ redirectFlag: false }
然后您只需使用
数据访问redirectFlag。redirectFlag

  • 在AJAX启动之前,初始化应该重定向到什么(如何说“创建一个变量,但不要给它赋值!”)

    您可以这样做:
    var shouldRedirect

然而,我会做
var shouldRedirect=false以确保shouldRedirect未定义

  • data.rows[0].redirectFlag是获取变量值的正确方法吗
取决于从AJAX请求返回的内容。通常响应是JSON格式的,因此,如果返回值为true的JSON对象,则可以执行以下操作:

shouldRedirect = data.redirectFlag;
对于第1部分,要声明具有值的变量,请使用: var应该重定向。这样,您就可以执行if(!shouldRedirect){}


第二部分。如何从redirectFlag获取值取决于ajax调用返回的数据的形成。数据。。。将是您获取值的起点。

如评论部分所述,设置
shouldRedirect
标志没有帮助,因为
$后面的
if
语句将在从服务器获取结果之前对ajax
请求进行评估-这是异步代码执行中面临的常见问题。虽然从理论上讲,可以通过
sync
参数强制jQuery.ajax进入同步模式,但我不建议这样做,因为它会在发出请求时锁定浏览器UI

您需要将重定向代码移动到
$函数中。ajax
success
函数如下:

$.ajax({
    url: 'http://example.com',
    // ... other options omitted for brevity

    success: function(data) {
        // This code block gets executed when the operation completes.
        var shouldRedirect = data.rows[0].redirectFlag
        if (shouldRedirect) {
            // Your redirection code goes here.
            window.location = "...";
        }
    }
});
如果您使用jQuery 1.7或更高版本,可以通过使用它们的实现。延迟对象允许您在操作完成时执行一个或多个函数,并使异步代码更易于阅读

$.ajax({ url: 'http://example.com' })
    .done(function(data) { 
        // This code block gets executed when the operation completes.
    });
除了将函数闭包传递给
done
,还可以传递对成员函数的引用,例如:

$.ajax({ url: url }).done(onDataLoaded);

function onDataLoaded(data) {
    // This function gets called when the ajax operation completes.
}

您的
asynch
属性错误,它应该是
async
。如果请求是异步的,这永远不会起作用,因此您需要更改它。@jamesalardice:我认为这很好。同步请求无论如何都是不好的:)@ThiefMaster-同意,它们是不好的,但在这种情况下,这是执行OP尝试执行的操作的唯一方法(在
success
事件处理程序之外使用AJAX请求返回的值)。@ThiefMaster,这里的具体问题是
if(shouldRedirect)[…]
将在ajax调用返回之前执行,因此不会实际执行任何操作。因此,虽然异步操作确实是正确的处理方式,但这段代码只在同步模式下工作。是的,但他更应该将代码放在处理程序中。