2012-08-14 4 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 :

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

<submit form> 

A: ASDFG 

대신에, 두 번째 양식 제출 후, 내가 얻을 : http://jsfiddle.net/tUtRH/

경고 가야 얼굴에

A: QWERTY 

모든 때려 또는 차가운 물이 내 머리 위로 쓰레기가 정말 감사하겠습니다. (물론이 코드는.이 실제로/도착 토큰 등을 설정 폴링/AJAX 호출의 무리이며, 최소한의 사건을 다루 아래로 제거 된)

+0

그들은 모두 같은 좋은 대답이야, 내가 그들을 선택할 수 있으면 좋겠다 ** 모든 ** 정확한! – Spanky

답변

3

귀하의 문제는 pollServer에 매개 변수가 token라는 점이다.

무슨 일이 일어나고있는 건 pollServer 안에 로컬 token을 설정하고 있습니다.

3

자바 스크립트는 기능 범위입니다. 토큰 매개 변수를 함수 pollServer에 전달하면 token이라는 로컬 변수가 만들어지며 전역 변수 대신이 변수가 사용됩니다.

이것은 SO에서 가장 많이 묻는 JS 질문 중 하나입니다. 그 및 비동기 가변 타이밍 할당.

+0

감사합니다. 나는 공통의 방법으로 설명하기가 어렵 기 때문에 비슷한 질문을 찾기 란 어려운 질문이라고 생각한다. – Spanky

2

전역 변수 token이 있으며이 변수는 함수 매개 변수 token으로 마스크되어있어 함수 내부의 할당이 함수 외부에 적용되지 않습니다.

+1

그래, 이제 알겠지만, 전 세계와 같은 이름의 지역적으로 범위가 지정된 변수를 만들었습니다. 완벽하게 이해합니다. – Spanky

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/

관련 문제