2012-08-14 61 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/