【问题标题】:What problems could occur declaring a variable inside an if condition twice?在 if 条件内声明变量两次会出现什么问题?
【发布时间】:2017-08-18 08:10:51
【问题描述】:

在 if 条件中声明变量两次可能会出现什么问题?

我知道这不是最好的方法!
我知道我可以在 if 条件之外声明变量。

我不是在寻找解决方案!我不是在寻找如何声明我的变量。我想了解为什么这是在 if 条件块中声明 a 变量的不好方法。

/* Yes I know I can just have condition instead of condition === true, 
   this is only for simplicity */
if(condition === true){ 
    var StuckUps = "over 9000";
}else if(condition === false){
    var StuckUps = "Nothing";
}

alert(StuckUps) /* Yes I can access it outside the if condition!*/

如果只执行一个条件,为什么这是一个坏习惯,所以这意味着变量无论如何只会被声明一次。它的真正问题是什么?

【问题讨论】:

  • 如果你的条件是NaN会怎样?
  • 简单答案:浏览器依赖
  • 你知道什么是吊装吗?
  • @BartoszT 不,我以前没听说过
  • 更不用说可读性了:var StuckUps = condition ? "over 9000" : "Nothing";

标签: javascript


【解决方案1】:

你是对的,它没有错,但是正如 ECMAscript 中所指定的,它将被提升到最近的函数定义的顶部。

这可能会在拥有大型代码库时导致问题,并且“难以”找到。

【讨论】:

  • 正确 - 而且我认为当一个变量在比它使用的更深的范围内声明时,它会让大多数人感到困惑。善待你的同事——编写易于调试的可理解代码!
  • 这是真的,所以技术上没有程序错误,但人类可读的困难?
  • 正是我的观点。据我所知,严格模式还可以防止这种行为?
  • 而且,人们从经验中了解到,在函数顶部声明变量是避免此类问题的最佳方法。见this
  • 正如上面 Nolyum 回答的那样,如果您希望将变量限定为 if 条件,请使用“let”关键字。 “let”关键字将是块作用域,其中“var”关键字是函数作用域。但是,从 ES6 开始可以使用 let 关键字,因此如果您不使用 ES6,您将无法阻止作用域。
【解决方案2】:

var 目标是声明全局变量,即使您在另一个上下文(如函数)中声明它,if/else 语句也可以在任何地方访问该变量...

然而在大多数编程语言中,如果你在一个块中声明一个变量(for、if、function...),该变量只存在于这个块中。

在下一代 javascript let 中,大多数情况下会替换 varlet 将具有前面描述的行为。

另一个问题是,如果您在运行脚本时遇到错误,则很难找到第一次声明变量的位置。

【讨论】:

  • 很酷,谢谢我只问了这个问题,因为我认为知道真正的错误是什么很有趣,而且似乎大多数人都同意没有程序错误,但阅读它时会有更多的人为困难。我说的对吗?
  • 正确。 Javascript 是非常宽松的,在大多数其他语言中你不能这样做。在 javascript 中,当您使用var 时,该变量作为属性存储在window 对象中。 window 对象随处可访问,因此变量随处可访问。
  • 谢谢 我不知道为什么上次我问这个问题时有些人对我如此粗鲁。我知道这很糟糕,但很高兴知道它可能导致的实际事实和程序问题是什么。更不用说我现在被阻止在我的真实账户上提问 ¬¬
  • 不是程序问题,但我不建议这样做,以保持代码的可读性,更容易为您和帮助您或与您合作的人调试。祝你有美好的一天;)
  • 是的,我也不这样做,只是我想让人们参与讨论它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
相关资源
最近更新 更多