在这个简化的小提琴中,我试图重新设置“令牌”的值,以便在后续的表单提交中使用,但是尽管设置了值,下一次传递,'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();
}
DEMO:http://jsfiddle.net/tUtRH/
警报应该:
<submit form>
A:
B: QWERTY
Calling with token: QWERTY
OLD: QWERTY
NEW: ASDFG
<submit form>
A: ASDFG
相反,在第二次表单提交后,我得到:
A: QWERTY
脸上的任何耳光或倾倒在我头上的冷水都会非常感激。 (显然,这段代码已被删除以涵盖最小的情况,这实际上是一堆轮询/ AJAX调用来获取/设置令牌等。)
答案 0 :(得分:3)
您的问题是pollServer
的参数称为token
。
正在发生的事情是,在pollServer
内设置本地token
,而不是全局。{/ p>
答案 1 :(得分:3)
Javascript是功能范围。通过将令牌参数传递给函数pollServer
,您将创建一个名为token
的局部变量,而不是全局变量。
这是关于SO的最常见的JS问题类型之一。那和异步变量时序分配。
答案 2 :(得分:2)
您有一个全局变量token
,它被函数参数token
屏蔽,因此函数内部的赋值在函数外部没有任何影响。
答案 3 :(得分: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!');
}
}