在javascript的块作用域内用'var'声明的内部函数表达式

问题描述 投票:0回答:1

我知道用这种方式编写代码并不是完全有意义,但这正在测试我对范围链和块范围的理解:

function mygreeting(){
    var myvar = "init"

    if(myvar === "init"){
        let blockScoped = "hello";

        var mygreet = function() {
            console.log(blockScoped);
        }    

        return mygreet;
    }

}

mygreeting()(); //outputs 'hello'

我知道这是一个闭包,内部函数将保留对其外部环境的引用,但实际上我想弄清楚的是为什么函数范围的函数表达式能够找到块范围的变量(封闭)。它是否在其作用域链中存储块作用域变量,函数表达式的作用域链是否取决于表达式的声明方式(使用let或var?)谢谢!

javascript scope closures block chain
1个回答
0
投票

一个函数可以访问其作用域和封装该作用域的所有变量。因为声明myVarmygreet在同一范围内,所以它可以“看到”它。

"Each function has its own scope, and any variable declared within that function is only accessible from that function and any nested functions."

帮助我点击的类比是将嵌套范围镜成像为一个孔。当您在洞中时,无论它有多深(嵌套),您始终可以仰望天空,而俯视时则看到灰尘。同样,任何函数都可以访问在其作用域(孔的底部)+任何嵌套作用域(孔的壁)+全局作用域(天空)中声明的变量。]​​>

var one = 1

function foo() {
  var two = 2

  function foobar() {
    var three = 3
    console.log(one) // works
    console.log(two) // works
    console.log(three) // works
    console.log(four) // doesn't
  }
}

function bar() {
  var four = 4

  console.log(one) // works
  console.log(two) // doesn't work
  console.log(three) // doesn't work
  console.log(four) // works

}

关于letvar,唯一的区别是let将其块视为示波器。但是,同样的规则仍然适用。在该块中声明的函数(可以在声明时“看到”该变量)将能够在执行时引用该变量。

© www.soinside.com 2019 - 2024. All rights reserved.