2013-05-16 200 views
3

美好的一天,我偶然發現了JS中變量範圍的問題。 我有這樣JavaScript中的變量範圍,函數不返回正確的值

var address = ...; //it may be or may not be defined earlier. 
// It is not the only variable passed to the function 

function search() { 
    window.location.search = address; 
} 

功能,但我需要確保在定義這個變量,所以我這樣做

function search() { 
    function check(value) { 
     if(!value) { 
      value = "1"; 
     } 
     return value; 
    } 
    check(address); 
    window.location.search = address; 
} 

但我得到有時是不確定的,傳遞給了window.location .search,因爲check()確實返回「1」;

請你指出我的錯誤嗎?

[更新]

我應該早點說 - 我只是在尋找更好的方法來做到這一點。 當然簡單,如果檢查會得到它的權利,但在$地址變量是不是唯一一個 你能想象像這樣

totaladdress = address1; 
totaladdress += address2; 
totaladdress += address3; 
totaladdress += address4; 
totaladdress += address5; 
... 
window.location.search = totaladdress; 

所以我需要一個函數進行檢查(如檢查(地址1);)並避免幾十個IF來使代碼更清潔。

+0

如果可以或不可以被定義你需要使用'typeof運算富===「undefined'' 。 – elclanrs

+0

你想要'window.location.search = check(address);'?你不會在任何地方使用'check'調用的結果 – Bergi

回答

1

當你將「1」 value它不修改address因爲address關聯的字符串引用複製到value,而不能修改原始參考。例如:

var address = "abc"; 
var value = address; 
value = "def"; 
// address is still "abc" 

您正確地從函數返回字符串,但返回的值被忽略,所以它沒有幫助。你想要的是

address = check(address); 
window.location.search = address; 

或只是

window.location.search = check(address); 

甚至

function setAddress(value) { 
    window.location.search = value || "1"; 
} 
+0

謝謝湯姆!正是我需要的! – Kresent

1

不能使用的功能爲這種檢查,如果變量可能是不確定的 - 你需要直接在您使用的可能未定義的名字的地方使用typeof

function search() { 
    window.location.search = typeof address !== 'undefined' ? address : 'some default value'; 
} 
+0

這是一個vaild選項,但事實是 - 如果我從檢查函數內記錄變量 - 如果未定義,它將正確顯示爲「1」。問題是這個「1」在此之後被丟棄,最後我再次得不到定義。 – Kresent

0

你再沒有返回任何來自check方法的值。

function search() { 
    function check(value) { 
     if(!value) { 
      value = "1"; 
     } 
     return value; 
    } 
    window.location.search = check(address); 
} 
0

[更新]抱歉您誤解了您的需求。你可以試試這個。

var address = ...; //it may be or may not be defined earlier. 
// It is not the only variable passed to the function 

function search(){ 
    window.address = (window.address === undefined)? 1:window.address; 
    window.location.search = window.address; 
} 
+0

只有在全局範圍內定義了「address」時纔有效。 – ThiefMaster

+0

我以爲是。 – HMR