【问题标题】:How to use scope correctly?如何正确使用作用域?
【发布时间】:2019-05-15 15:56:24
【问题描述】:

我不确定何时将变量放在函数的顶部和内部。

我尝试将变量放在顶部,有时放在函数内部。但是,在某些情况下,它并不总是像这种情况那样在内部。

function transformFirstAndLast(array){
    var first = array[0];
    var last = array[array.length-1];
    var squid = {};

    squid[first] = last;
    return squid;
}

var first = array[0];
var last = array[array.length-1];
var squid = {};

function transformFirstAndLast(array){
    squid[first] = last;
    return squid;
}

第一个有效。但是,我认为您可以访问变量,因为它是全局范围的?我很困惑为什么第二个不起作用?

【问题讨论】:

  • 一般规则是变量应该被限制在它们需要的最小范围内。如果你不需要在多个函数中访问一个变量,它不应该是一个全局变量。
  • 无法复制。如果我在全局范围内使用 var array = ['first', 'second', 'last'] 运行您的代码,您的函数将返回 {first: 'last'}

标签: javascript scope


【解决方案1】:

第二个代码的问题是你试图访问不存在的东西:

var first = array[0]; // <-- trying to access 'array'
var last = array[array.length-1]; // <-- trying to access 'array'
var squid = {};

function transformFirstAndLast(array){ // <-- 'array' is an argument of this function, and therefore only exists inside of the function
    squid[first] = last;
    return squid;
}

在 JavaScript 中,您可以访问在您所在的范围内声明的变量以及您的父级。

希望有帮助!

【讨论】:

    【解决方案2】:

    让我们以你的最后一个例子为例:

    var first = array[0];
    var last = array[array.length-1];
    var squid = {};
    
    function transformFirstAndLast(array){
        squid[first] = last;
        return squid;
    }
    

    在第 1 行,arrayundefined,因为它不在当前范围内。变量array 仅存在于transformFirstAndLast 方法中。如果你调用这个方法会发生什么:

    • squid 存在:{}
    • firstlast 都是 undefined
    • 我们将属性 undefined (= first) 分配给对象 squid,其值为 undefined (= last)
    • 我们返回{ undefined: undefined }

    您可以在需要的地方声明变量。在这种情况下,firstlast 仅在您有 array 时才有意义,所以在方法中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 2018-02-04
      • 2011-06-28
      • 1970-01-01
      • 2014-04-19
      相关资源
      最近更新 更多