JavaScript中的变量范围,函数不返回正确的值

时间:2013-05-16 07:12:42

标签: javascript function scope

美好的一天,我偶然发现了JS中变量范围的问题。 我有这样的功能

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”;

你能指出我的错误吗?

[UPDATE]

我应该早些说过 - 我只是想找一个更好的方法来做。 当然检查是否正确,但是$ address变量不是唯一的 你可以像这样想象它

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

所以我需要一个函数来检查它们(例如check(address1);)并避免几十个IF来使代码更清晰。

4 个答案:

答案 0 :(得分:1)

如果变量可能未定义,则不能使用函数进行此类检查 - 您需要在使用可能未定义的名称的位置直接使用typeof

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

答案 1 :(得分:1)

当您为value分配“1”时,它不会修改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";
}

答案 2 :(得分:0)

您没有从check方法返回任何值。

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

答案 3 :(得分: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;
}