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

时间:2012-05-02 11:09:21

标签: javascript jquery html

我有一种情况需要从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布尔值,data.rows[0].redirectFlag是获取变量值的正确方法吗?和
  • 在AJAX启动之前我将shouldRedirect初始化为什么(如何说“创建变量但不给它一个值!”)?

提前致谢!

4 个答案:

答案 0 :(得分:1)

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

var shouldRedirect;

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

var shouldRedirect = false;

这可能不是你想要的。您可以通过严格地将变量与undefined进行比较来检查变量是否已初始化:

if (shouldRedirect === undefined) // do something

但请注意,您必须使用三等号运算符(也就是严格相等),否则您的结果将不会如预期的那样。另一方面,未定义的变量将产生错误的结果。这意味着当使用简单的if (shouldRedirect)检查变量并且变量未定义时,它将产生false,就像它被设置为false一样。对于JavaScript中的其他几个值也是如此,例如空字符串""或值null。您可以看到完整的值假名列表here。如果要明确检查true或false并想要省略其他falsy或truthy值,则应检查三次相等,例如if (shouldRedirect === true)

此外,如果data.rows[0].redirectFlag是访问该值的正确方法,则高度依赖于您从AJAX调用接收的数据结构的实际情况。如果它类似于以下内容则是正确的:

{ rows: [ {redirectFlag: true}, {redirectFlag: false} ] }

如果你的JSON看起来像以下那样

{ redirectFlag: false }

然后您只需使用data.redirectFlag访问redirectFlag。

答案 1 :(得分:0)

  • 在AJAX启动之前我应该​​如何初始化shouldRedirect(如何创建变量但不给它一个值!)?

    您可以这样做:var shouldRedirect;

但是,我会var shouldRedirect = false;确保shouldRedirect未定义

  • data.rows [0] .redirectFlag是获取变量值的正确方法吗?

取决于您从AJAX请求发回的内容。通常响应是JSON,所以如果你发送一个值为true的JSON对象,那么你可以这样做:

shouldRedirect = data.redirectFlag;

答案 2 :(得分:0)

对于第1部分声明一个带有值的变量使用: var shouldRedirect。这样你就可以做一个if(!shouldRedirect){}。

对于第2部分。如何从redirectFlag获取值是基于从ajax调用返回的数据的形成。数据......将是您获得价值的起点。

答案 3 :(得分:0)

正如评论部分所述,设置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或更高版本,则可以通过Promises/A使用defered object实现。 Deferred对象允许您在操作完成时执行一个或多个函数,并使异步代码更易于阅读。

$.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.
}