【问题标题】:Javascript var, let and functionJavascript var、let 和函数
【发布时间】:2021-08-11 05:02:57
【问题描述】:

    let x = '1'
    function first(){
        console.log(x)
    }
    x='2'
    function second(){
        let x='3'
        first()
    }
    second()

我的问题是,为什么答案是“2”而不是“3”? 我知道 let 是块作用域而 var 是函数作用域,但我只是不明白这一点。请在这里帮助我,谢谢!

【问题讨论】:

  • 因为let x='3' 范围在second 中,但console.log(x)first ... 所以全局x 是它记录的x - 请注意范围letvar 无关 - 如果您使用 var 而不是 let,结果将是相同的 - 此外,因为您的外部 let 在全局范围内,而内部 @987654333 @ 在函数范围内,也没有“块范围”在起作用
  • @DBS - 不涉及this,因此上述变量的范围不会改变
  • 因为 let x = '3' 不是全局变量。让 x = '1';是在所有地方使用的全局变量。在下一步中,您可以将 x 值 1 更改为 2。这就是为什么您的 Ans 为 2。

标签: javascript hoisting


【解决方案1】:

您将 3 分配给一个局部变量,它只在 second 函数内部起作用

这个例子有效:

let x = '1'

function first(){
    console.log(x)
}

x='2'

function second(){
    x='3'
    first()
}

second()

【讨论】:

    【解决方案2】:

    最初函数first 不知道x 是关于什么的。所以它会自动在上层范围内搜索。

    很高兴,在全局范围内有 x 定义。

    因此,当这个脚本被初始化时,函数first中的函数console.log保留了x的内存地址,并一直监视那个全局变量。

    【讨论】:

      【解决方案3】:

      这是因为shadowing

      在 JavaScript 中,可以在多层嵌套范围内指定同名变量。在这种情况下,局部变量优先于全局变量。如果你声明了一个同名的局部变量和一个全局变量,当你在函数或块中使用它时,局部变量将优先。

      在您的情况下,您的 first() 函数内没有定义局部变量,因此它将采用全局变量的 x = 2 的值。

      let x = '1'
      
      function first() {
        console.log(x)
      }
      x = '2'
      
      function second() {
        let x = '3'
        first()
      }
      second()

      参见下面的代码,如果你在first() 中声明了x=4,那么它将返回值4 instead of 2

      let x = '1'
      
      function first() {
        x = '4'
        console.log(x)
      }
      x = '2'
      
      function second() {
        let x = '3'
        first()
      }
      second()

      如果您想了解更多关于JavaScript Variable Scope and Hoisting 的信息,请查看此内容:https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 2018-05-14
        • 1970-01-01
        • 2020-06-02
        • 2016-04-05
        • 2018-06-08
        • 2018-12-09
        相关资源
        最近更新 更多