javascript之为什么在函数中使用 let 声明的一些变量在另一个函数中可用,而另一些则导致引用错误

zfyouxi 阅读:19 2024-10-01 17:34:08 评论:0

我不明白为什么变量在函数内声明时表现得如此奇怪。

  • first我用 let 声明的函数变量 bc值为 10:
    b = c = 10; 
    

    second我展示的功能:
    b + ", " + c 
    

    这表明:
    10, 10 
    
  • 也在 first我声明的函数a值为 10:
    let a = b = c = 10; 
    

    但在 second函数显示错误:

    Can't find variable: a

  • 现在在 first我声明的函数d值为 20:
    var d = 20; 
    

    但在 second函数它显示与以前相同的错误,但变量 d :

    Can't find variable: d


  • 例子:

    function first() { 
      let a = b = c = 10; 
      var d = 20; 
      second(); 
    } 
     
    function second() { 
      console.log(b + ", " + c); //shows "10, 10" 
     
      try{ console.log(a); }  // Rreference error 
      catch(e){ console.error(e.message) } 
     
      try{ console.log(d); } // Reference error 
      catch(e){ console.error(e.message) } 
    } 
    first()

    请您参考如下方法:

    这是因为你实际上是在说:

    c = 10; 
    b = c; 
    let a = b; 
    

    而不是你认为你在说什么,那就是:
    let a = 10; 
    let b = 10; 
    let c = 10; 
    

    您会注意到,无论您将多少变量添加到您的链中,它只会是第一个 (a) 导致错误。

    这是因为“让”将您的变量范围限定为您声明它的 block (或“本地”,或多或少意味着“在括号中”)。

    如果您声明一个不带“let”的变量,它会在全局范围内定义该变量。

    因此,在您设置变量的函数中,所有内容的值都为 10(如果放置断点,您可以在调试器中看到这一点)。如果您在第一个函数中放置 a、b、c 的控制台日志,那么一切都很好。

    但是一旦你离开那个函数,第一个(a)——再一次记住,从技术上讲,按照分配的顺序,它是最后一个——“消失”(再次,你可以在如果您在第二个函数中设置断点,则调试器),但其他两个(或添加的任何数量)仍然可用。

    这是因为,“让”仅适用于(因此仅在本地范围内)第一个变量——同样,它在技术上是最后一个被声明并分配值的——在链中。其余的技术上没有“让”在他们面前。因此,它们在技术上是全局声明的(即在全局对象上),这就是它们出现在您的第二个函数中的原因。

    试试看:删除“let”关键字。您的所有变量现在都将可用。

    “var”具有类似的局部作用域效果,但变量“提升”的方式不同,这是您绝对应该理解的,但与您的问题没有直接关系。

    (顺便说一句,这个问题会难倒足够多的专业 JS 开发人员,使其成为一个好的问题)。

    强烈建议您花时间了解在 JS 中如何声明变量的差异:没有关键字、使用“let”和使用“var”。


    标签:JavaScript
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号