【问题标题】:Scope of variables in JavaScript, function does not return correct valueJavaScript中的变量范围,函数不返回正确的值
【发布时间】:2013-05-16 07:12:42
【问题描述】:

美好的一天,我偶然发现了 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 以使代码更清晰。

【问题讨论】:

  • 如果它可能被定义,也可能没有被定义,你需要使用typeof foo === 'undefined'
  • 你想要window.location.search = check(address);吗?您不会在任何地方使用check 调用的结果

标签: javascript function scope


【解决方案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";
}

【讨论】:

  • 谢谢汤姆!正是我需要的!
【解决方案2】:

您不能使用函数来检查变量是否可能未定义 - 您需要在使用可能未定义名称的地方直接使用typeof

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

【讨论】:

  • 这是一个有效的选项,但问题是 - 如果我从检查函数中记录变量 - 如果未定义,它会正确显示为“1”。问题是这个“1”在那之后被丢弃了,最后我又得到了未定义。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    [更新]抱歉误解了您的需要。你可以试试这个。

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

    【讨论】:

      猜你喜欢
      • 2016-01-03
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多