3

美好的一天,我偶然发现了 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”;

你能指出我的错误吗?

[更新]

我应该早点说-我只是在寻找更好的方法来做到这一点。如果检查会正确,当然很简单,但 $address 变量不是唯一的你可以像这样描绘它

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

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

4

4 回答 4

1

如果变量可能未定义,您不能使用函数进行这种检查 - 您需要typeof直接在使用可能未定义名称的地方使用:

function search() {
    window.location.search = typeof address !== 'undefined' ? address : 'some default value';
}
于 2013-05-16T07:14:35.457 回答
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";
}
于 2013-05-16T07:42:26.473 回答
0

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

function search() {
    function check(value) {
        if(!value) {
            value = "1";
        }
        return value;
    }
    window.location.search = check(address);
}
于 2013-05-16T07:14:46.903 回答
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;
}
于 2013-05-16T07:15:27.210 回答