我知道用这种方式编写代码并不是完全有意义,但这正在测试我对范围链和块范围的理解:
function mygreeting(){
var myvar = "init"
if(myvar === "init"){
let blockScoped = "hello";
var mygreet = function() {
console.log(blockScoped);
}
return mygreet;
}
}
mygreeting()(); //outputs 'hello'
我知道这是一个闭包,内部函数将保留对其外部环境的引用,但实际上我想弄清楚的是为什么函数范围的函数表达式能够找到块范围的变量(封闭)。它是否在其作用域链中存储块作用域变量,函数表达式的作用域链是否取决于表达式的声明方式(使用let或var?)谢谢!
一个函数可以访问其作用域和封装该作用域的所有变量。因为声明myVar
时mygreet
在同一范围内,所以它可以“看到”它。
帮助我点击的类比是将嵌套范围镜成像为一个孔。当您在洞中时,无论它有多深(嵌套),您始终可以仰望天空,而俯视时则看到灰尘。同样,任何函数都可以访问在其作用域(孔的底部)+任何嵌套作用域(孔的壁)+全局作用域(天空)中声明的变量。]>
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 }
关于
let
与var
,唯一的区别是let
将其块视为示波器。但是,同样的规则仍然适用。在该块中声明的函数(可以在声明时“看到”该变量)将能够在执行时引用该变量。