用';var';在javascript中的块范围内
我知道以这种方式编写代码没有完全意义,但这是在测试我对作用域链和块作用域的理解:用';var';在javascript中的块范围内,javascript,scope,closures,block,chain,Javascript,Scope,Closures,Block,Chain,我知道以这种方式编写代码没有完全意义,但这是在测试我对作用域链和块作用域的理解: function mygreeting(){ var myvar = "init" if(myvar === "init"){ let blockScoped = "hello"; var mygreet = function() { console.log(blockScoped); } retu
function mygreeting(){
var myvar = "init"
if(myvar === "init"){
let blockScoped = "hello";
var mygreet = function() {
console.log(blockScoped);
}
return mygreet;
}
}
mygreeting()(); //outputs 'hello'
我知道这是一个闭包,内部函数将保留对其外部环境的引用,但我真正想弄明白的是为什么函数范围的函数表达式能够在其闭包中找到块范围的变量(blockScoped)。它是否在其作用域链中存储块作用域变量,函数表达式的作用域链是否取决于表达式的声明方式(使用let或var?)谢谢 函数可以访问其作用域和封装它的作用域中的所有变量。因为当声明
mygreet
时,myVar
在同一范围内,所以它可以“看到”它
一个有助于我点击的类比是将嵌套的示波器成像为一个孔。当你在洞里时,无论它有多深(嵌套),你总是可以抬头看天空,但向下看你只看到泥土。类似地,任何函数都可以访问在其作用域(孔底)+任何嵌套作用域(孔壁)+全局作用域(天空)中声明的变量
var one=1
函数foo(){
变量2=2
函数foobar(){
变量三=3
console.log(一)//工作正常
console.log(两个)//works
console.log(三)//works
console.log(四)//没有
}
}
功能条(){
变量4=4
console.log(一)//工作正常
console.log(2)//不工作
console.log(三)//不工作
console.log(四)//工作正常
}
至于
let
vsvar
,唯一的区别是let
将其块视为作用域。但同样的规则仍然适用。在该块中声明的函数(可以在声明点“看到”变量)将能够在执行时引用该变量。blockScoped
在定义(创建)函数时可见(在范围内),因此它可以访问该函数。无论你是使用let
,var
,甚至只是一个生命,在这里都无关紧要。