2012-08-14 28 views
1

在这个简化的小提琴中,我试图重新设置用于后续表单提交的“标记”的值,但是尽管设置了值,下一个传递'标记'仍然设置为QWERTY的初始值。Javascript变量貌似不会设置

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

他们都是这么好的答案,我希望我能选择其中** **全部正确! – Spanky 2012-08-14 20:34:13

回答

3

您的问题是参数被称为token

发生了什么事情,在pollServer里面,你设置的是当地的token,而不是全球的。

3

Javascript在功能范围内。通过将令牌参数传递给函数pollServer,您将创建一个名为token的局部变量,该变量将用于代替全局变量。

这是关于SO的最常见类型的JS问题之一。这和异步可变时间分配。

+0

谢谢。我想这是一个难以搜索类似问题的难题,因为它很难用普通的方式描述 – Spanky 2012-08-14 20:29:45

2

您有一个全局变量token,它被函数参数token所掩盖,所以函数内部的赋值对函数外部没有任何影响。

+1

是的,现在我明白了,我创建了一个与全局同名的本地作用域变量。非常有意义。 – Spanky 2012-08-14 20:23:55

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/