2013-05-16 141 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