let应该是个局部变量,但是这段代码当中为什么let作为全局变量,而不报错,还能够正常输入
let是所在块内的局部变量,你那样申明的代码都是一个块内的,当然可以访问,下面的这样不行了。var没有块作用域,所以如果let改为var不会报错
{
let x=99;//改为var没问题
}
function foo(p=x+1){
console.log(p)
}
foo()//报错
你是在全局的作用域下声明的,它就是全局的。
作用域链原理是先在本作用域查找,找不到再去父作用域链查找,如果找到了就会停止查找
//全局作用域
function(){
//函数作用域
for(){
//块级作用域
}
}
对于var来说没有块级作用域,只有全局和函数作用域,块级作用域只是函数作用域的一部分。而对于变量的可见性来说,子级作用域是可见父级作用域内的变量的,父级却不可见子级。let的区别只是比var多了一层作用域而已,并不改变可见性的规律。
都是个人理解,用词可能不够书面官方,希望可以理解。
单独的一对{}就是一个块级作用域
是不会在另一个作用域下被访问
除非这两个作用域是有层级关系的
单独的一对{}就是一个块级作用域
是不会在另一个作用域下被访问
除非这两个作用域是有层级关系的
单独的一对{}就是一个块级作用域
是不会在另一个作用域下被访问
除非这两个作用域是有层级关系的
通过var定义的变量,作用域是整个封闭函数,是全域的 。通过let定义的变量,作用域是在块级或是子块中,只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的,尽管代码块外也存在相同全局变量。