【问题标题】:If statement vs function blocks for var keywords [duplicate]var关键字的if语句与功能块[重复]
【发布时间】:2020-01-24 17:09:09
【问题描述】:

我的问题是为什么一个变量(当使用 var 关键字时)可以在 if 语句块之外访问,但不能在函数块之外访问?考虑这段代码:

let age = 30;

if (true){
    let age = 40
    console.log('inside', age)  //logs inside, 40//
    var name = 'shaun'
}

console.log('outside if loop', age, name) //logs outside if loop, 30, shaun //

function test (){
    var xyz = 'ashley';
    console.log(xyz)

}
test ()

console.log('outside function', xyz) //throws an error//

感谢您的宝贵时间。任何见解将不胜感激!

【问题讨论】:

标签: javascript loops if-statement scope


【解决方案1】:

因为当前的执行上下文。值和表达式“可见”或可以引用的上下文。如果变量或其他表达式不在“当前范围内”,则它不可用。范围也可以分层分层,以便子范围可以访问父范围,反之则不行。

函数在 JavaScript 中充当闭包,因此创建了一个作用域,因此(例如)在函数内独占定义的变量不能从函数外部或其他函数内访问。

此外,ES6 确实具有使用 letconst 关键字但不使用 var 的变量定义的块范围。

Here is an article on Wikipedia about Scope.

【讨论】:

  • 所以 for 循环或 if 语句的范围被认为与函数的范围不同?我认为它们都是本地范围,因此不应该在全球范围内访问?但在我的示例中,很明显 if 语句的局部变量名称可以在语句之外访问,但函数变量不能。
  • JavaScript 没有“块作用域”,它只有函数作用域 - 因此在 if 语句(或任何条件块)内声明的变量被“提升”到外部作用域。
  • 啊啊啊!!!这为我清除了它。非常感谢!!!
  • 'JavaScript 没有“块作用域”' - letconst 想谈谈...
  • 也许我需要了解更多,你是对的,似乎在 ECMAScript 2015(第 6 版)之后范围发生了变化。我编辑了答案。
猜你喜欢
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多