js 作用域es6之前 存在 函数作用域和全局作用域 在es6添加let 新增了块级作用域
变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。
函数作用域
作用在函数内部的局部变量
只能在函数作用域内部访问
function fun(){
var a = 1
console.log(a)
}
console.log(a) //报错 a is not defined
fun() //1
全局作用域
使用var关键字 定义声明变量 var 定义存在变量提升 所以你在使用之前定义还是使用之后定义 都会默认提升
(没有定义声明的变量直接赋值 该变量为全局变量)
console.log(a)//undefined
var a = 1
相当于
var a
console.log(a)
a = 1
es6 的块级作用域
只能在变量定义的代码块中可以访问
{
let a = 1
console.log(a)
}
console.log(a) //报错a is not defined
作用域链
什么是作用域链? 比如我在一个作用域中使用到了a变量 但是在这个作用域中我并没有定义声明a变量(在这个作用域中找不到a变量) 就往上一层(父级)中找 如果也没有 再往上一层(父级的父级)找 这样一层一层的关系 就叫作用域链
function fun() {
var a = 1
function fun1() {
var b = 2
function fun2() {
var c = 3
console.log(a) //1
console.log(b) //2
console.log(c) //3
}
}
}