JS作用域/作用域链/变量提升----3
作用域
作用域指一个变量的作用的范围 作用范围==作用域
作用域就是一个独立的地盘,让变量不会外泄、暴露出去。也就是说作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
例如:
function show(){
var a='局部变量'
}
show()
console.log(a);//a is not defined
在 JavaScript 中有两种作用域类型:
(1)全局作用域
(2)局部作用域(函数作用域 )
全局作用域
直接写在 script 标签中的 JavaScript 代码都是全局作用域。当页面打开运行时全局作用域就会自动创建,而当页面关闭时就会销毁。在全局作用域中有一个全局的 window 对象可以使用,而所有全局作用域对象都会作为 window 对象的属性来使用。(为什么全局变量不会销毁,因为js执行时从上往下执行,不清楚在下面的代码中这变量有没有使用)
<script>
let a = '全局作用域'
console.log(a);
</script>
在js代码里这个a不论在哪里都可以使用,使用完了之后,他还是存在,这种情况,变量a为全局变量
局部作用域(函数作用域)
作用于函数内的代码环境,就是局部作用域。由于跟函数有关,所以也称为函数作用域。
局部作用域(函数作用域)是在调用函数时才会被创建,函数执行完毕后就自动销毁。同时,每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。
在函数作用域中可以访问全局作用域,而在全局作用域中不能访问函数作用域。当在函数作用域中使用一个变量时,它会先在自身作用域内查找,如果找到就直接使用,如果没有找到则会向上一级作用域查找,直到找到全局作用域为止。如果都没有找到则会报错。
function show(){
let a='局部作用域'
}
show()
console.log(a);//a is not defined
当直接赋值没有声明的时候,这个变量会自动成为全局变量
function a() {
b = 10
}
a()
console.log(b);
作用链
作用域的集合就是作用域链(子集可以访问父集,父集不能访问子集)
function fn() {
var a=1
function fn1() {
var b=2
console.log(a);//1
function fn2() {
console.log(a);//1
console.log(b);//2
}
fn2()
}
fn1()
}
fn()
console.log(a);//a is not defined
从作用域链的结构可以看出,函数在执行的过程中,先从自己内部寻找变量,如果找不到,再从创建当前函数所在的作用域去找,从此往上,也就是向上一级找,直到找到全局作用域还是没找到。
作用域代码优化:在运行期上下文的作用域链中,标识符所在的位置越深,读写速度就会越慢。所以在编写过程中,尽量的使用局部变量,少使用全局变量
执行顺序:就近原则
var a=10;
function fn(){
var a=20;
console.log(a) //20
}
fn()

浙公网安备 33010602011771号