【问题标题】:what are the disadvantages of creating function scope around for loop in javascript?在javascript中围绕for循环创建函数范围有什么缺点?
【发布时间】:2018-03-26 17:41:32
【问题描述】:

使用 for 循环 将其包裹在 JavaScript 中的函数作用域 { } ?

function logs(){ //function scope started
  for(var i=1; i<=5; i++) {
    console.log(i); //i accessible
  }
  console.log(i); //i accessible
} //function scope ended
console.log(i); //i not accessible because it was declared in a block scope
logs();

【问题讨论】:

  • i 在 for 循环之外无法访问...
  • 如果变量 i 不在循环范围内 - 是不是很糟糕?
  • 如果您仔细,您的第二个 console.log(i) 会出错。
  • 如果变量 i 不在循环范围内 - 是不是很糟糕? 一点也不。这取决于你的目标是什么。
  • 当您仅使用var 时,没有“块范围”之类的东西,所以{} 绝对什么都不做,这个问题毫无意义,因为在使用时添加额外的{} var 不是任何人都会做的事情。这就像写console.log("test");;;;;;;;;;;;;;;;。当然,这是合法的,但它不会为你做任何事情,所以没有人会这样做。

标签: javascript for-loop


【解决方案1】:
{
  for(let i=1; i<=5; i++) {
   console.log(i); //i accessible
  }
  console.log(i); //i is not accessible
} 
console.log(i); //i is not accessible 

如果你使用 'let' 声明变量,它仅限于 for 块。

{
  for(var j=1; j<=5; j++) {
   console.log(j); //j accessible
  }
  console.log(j); //j accessible
} 
console.log(j); //j  accessible 

如果您使用 'var' 声明它而不是全局声明。

【讨论】:

    【解决方案2】:

    缺点是除非你在其中声明一个块作用域的变量,否则它是没有用的。

    使用var,变量在最近的函数范围或全局范围内声明 - 您可以而且应该省略那个额外的块。

    {
      for (var i=1; i<=5; i++) {
        console.log(i); // i accessible
      }
      console.log(i); // i still accessible
    }
    console.log(i); // i still accessible as well
    

    对于let,变量的作用域仅限于for 循环头和主体 - 您可以而且应该省略那个额外的块。

    {
      for (let i=1; i<=5; i++) {
        console.log(i); // i accessible
      }
      console.log(i); // i not accessible
    }
    console.log(i); // i still not accessible
    

    要使用该块,您要么必须设置一个标签并从中设置break,要么您需要在其中声明一个局部变量(在循环之外),例如

    {
      let i=0;
      for (i=1; i<=5; i++) {
        console.log(i); // i accessible
      }
      console.log(i); // i still accessible
    }
    console.log(i); // i not accessible
    

    【讨论】:

      【解决方案3】:

      当您只使用var 时,没有“块范围”之类的东西,所以{} 绝对什么都不做,这个问题没有意义,因为添加了一个额外的@987654323 @ 使用 var 时不是任何人都会做的事情。这就像写console.log("test");;;;;;;;;;;;;;;;。当然,这是合法的,但它并没有为你做任何事情,所以没有人这样做。 这是使用语言语法的错误,在这种情况下不会导致任何错误。

      当您使用var 时,变量的作用域是函数,它在其中声明(并且在该函数的任何地方都可用)或者它是全局,如果它没有在函数中声明。

      • 对于var,没有“块范围”之类的东西。
      • 使用let 创建块作用域。

      使用其中任何一种都没有好坏之分。这取决于你的目标是什么。

      【讨论】:

        【解决方案4】:

        主要缺点是:i 没有作用于循环,可以在循环外访问而不是循环块。

        使用 let 而不是 var 会让事情变得轻松。所以你不必创建额外的代码块 {}

        for(let i=1; i<=5; i++) {
          console.log(i); //i accessible
        }
        console.log(i); //i is not accessible

        【讨论】:

        • 你为什么认为这是一个劣势?这就是语言的运作方式。请看我的回答。
        • 我能想到的唯一缺点是 - 在使用 var 时多放了一对 { } --- 但 let 关键字解决了它。
        • 额外的{}var 完全无关。正如我所说,var 没有块作用域之类的东西。这不是缺点,是语法错误。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多