1

在这个简化的小提琴中,我试图重新设置 "token" 的值以在后续表单提交中使用,但是尽管设置了值,但在下一次通过时,'token' 仍然设置为 QWERTY 的初始值.

var token = '';

function pollServer(token) {

    alert("Calling with token: " + token);

    alert("OLD: " + token);
    token = "ASDFG"; // new token
    alert("NEW: " + token);

}

function onsubmit_action() {

    alert("A: " + token);

    if (token === '') {
        // set the initial token
        token = 'QWERTY';
    }

    alert("B: " + token);
    pollServer(token);
    event.preventDefault();

}​

演示:http: //jsfiddle.net/tUtRH/

警报应该去:

<submit form>
A:
B: QWERTY
Calling with token: QWERTY
OLD: QWERTY
NEW: ASDFG

<submit form>

A: ASDFG

相反,在第二次提交表单后,我得到:

A: QWERTY

任何打在脸上的耳光或泼在我头上的冷水都将不胜感激。(显然,此代码已被剥离以涵盖最低限度的情况,这实际上是一堆获取/设置令牌等的轮询/AJAX 调用。)

4

4 回答 4

3

pollServer您的问题是调用参数 to token

发生的事情是,在pollServer您内部设置的是本地的token,而不是全局的。

于 2012-08-14T20:19:11.403 回答
3

Javascript 是函数范围的。通过将令牌参数传递给函数pollServer,您正在创建一个名为的局部变量token,它将被使用而不是全局变量。

这是关于 SO 的最常见的 JS 问题之一。那和异步变量时序分配。

于 2012-08-14T20:19:18.423 回答
2

您有一个全局变量 ,token它被函数参数 屏蔽token,因此函数内部的赋值对函数外部没有影响。

于 2012-08-14T20:19:35.903 回答
1

JavaScript 中的原始变量是按值传递的 [1]。您应该使任何函数(例如您的 pollServer())函数不仅接受参数,而且返回修改后的值,并让调用者使用函数的返回值。更像:

function pollServer(token) {
   token = 'new value';
   return token;
}

function something_else() {
   var token = 'old value';
   token = pollServer(token);
   if (token != 'old value) {
       alert('Success!');
   }
}

[1] http://snook.ca/archives/javascript/javascript_pass/

于 2012-08-14T20:32:15.257 回答