【问题标题】:Assigning a variable to itself in a function在函数中将变量分配给自身
【发布时间】:2015-10-03 22:46:45
【问题描述】:

我试图在函数中为自己分配一个变量,如果该变量与函数的参数具有相同的名称,它似乎不起作用,但如果它们的名称不同,它就会起作用。一个代码示例更清楚地说明了这一点。

这是我应该预料到的行为吗?这是我的 d3 用例的精简示例,它提示了这个问题。我也在下面展示了这一点。

无效示例

var a;

function assign(a) {
    a = a;
}
assign("test")
console.log(a)

未定义

工作示例

var a;

function assign(b) {
    a = b;
}
assign("test")
console.log(a)

测试

用例

var data
d3.csv("data.csv", function(error, data) {
    //Doesn't work for me
    data = data
}
console.log(data)

未定义

【问题讨论】:

    标签: javascript scope closures shadow hoisting


    【解决方案1】:

    在您的第一个示例中,传递给函数 shadows 的参数 a 是在外部定义的变量 a,因此:a=a 是参数的赋值(传递给函数)对自己。

    【讨论】:

    • 阴影是我遗漏的技术术语。谢谢!
    【解决方案2】:

    在 Javascript 中,作用域是函数级作用域,因此每当引用变量时,都会在包含作用域(函数)中搜索它的声明,如果找到它就会使用它,否则它会继续在原型链中搜索直到全局作用域。因此,在您的情况下,它会尝试搜索 a 并将其作为参数 a 找到,因此它会在那里停止搜索并使用参数中的 a

    所以为了避免冲突,你有两种方法。

    1. 使用不同的名称
    2. 如果您想使用相同的名称,请使用显式范围解析。

    例如。

    var a;
    
    function assign(a) {
       Global.a = a //Global is placeholder here for outerscope that variable a is coming from.
    }
    assign("test")
    console.log(a);
    

    有助于更清晰理解的有用链接

    【讨论】:

      【解决方案3】:

      您可以使用window 对象来访问全局变量。

      var a;
      
      function assign(a) {
          window.a = a; // specifying the scope.
      };
      assign("test")
      console.log(a)
      

      更多关于15-common-javascript-gotchas的信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2017-09-28
        相关资源
        最近更新 更多