代码之家  ›  专栏  ›  技术社区  ›  Learner

具有开关盒的函数中“let”和“var”之间的区别

  •  -1
  • Learner  · 技术社区  · 5 年前

    我正在研究一个功能,我发现了一个问题,当使用let在一个功能的开关盒内。如果我改为var,它就会工作。我读到了let和var之间的区别,但这种情况是否导致了块级作用域的问题。有点困惑。

    感谢任何帮助

    var a = "sample data"
    const returnDataOfLet = (a) => {
    switch(typeof a){
        case "string": 
          let a = a.split(" ") // will throw an error change let to var it will work
          return a 
    }
    }
    
    console.log(returnDataOfLet(a))
    3 回复  |  直到 5 年前
        1
  •  2
  •   Quentin    5 年前

    在你申报的街区内 let a . 这将创建一个新变量 a .

    然后你打电话 a.split . 这会引发错误,因为 undefined (必须是 未定义 :你还没有给它一个值)。

    由于出现异常,程序在该点停止。


    如果你使用 var 而不是 let 然后 var 完全忽略,因为已经有 在该范围内声明。

    因为你还没有创建一个新变量, 是传递给函数的参数。

    这是一个字符串,所以你可以调用 split 并将结果分配回 参数列表中声明的变量。

        2
  •  0
  •   ellipsis    5 年前

    全球定义的 var a 不是传递给函数的 parameter . 就像一个 alias 对于一个 variable . 而且在 case " 一串 " 不需要再创建 a 因为它已经在函数中了。这不是问题 scopes 但是 definition parameters .

    var a = "sample data"
    const returnDataOfLet = (a) => {
    switch(typeof a){
        case "string": 
          a = a.split(" ") // will throw an error change let to var it will work
          return a 
    }
    }
    
    console.log(returnDataOfLet(a))

    如果你想用 let 使用其他变量名

    var a = "sample data"
    const returnDataOfLet = (a) => {
    switch(typeof a){
        case "string": 
          let b = a.split(" ") // will throw an error change let to var it will work
          return b 
    }
    }
    
    console.log(returnDataOfLet(a))
        3
  •  0
  •   Stephan T.    5 年前

    Here 是关于这个话题的详细指南。一般情况下:

    • 设为块范围,而var为函数范围(在函数外部不可见)。
    • 在声明之前不能访问let(var可以是,实际上是js世界中许多错误和混乱的根源)
    • 不能重新声明

    在这里使用let的方式是,在任何迭代中重新声明变量,这会导致错误。您始终可以重新分配thread的值。

    let a = "sample data";
    const returnDataOfLet = (a) => {
      switch (typeof a) {
        case "string":
          return a.split(" ");
      }
    }
    
    console.log(returnDataOfLet(a));