作用域:又叫变量作用域,是指变量作用的范围。
js中,有三种作用域
-
全局作用域(Script):页面任何地方都可以使用;他是全局变量,是在大括号外面声明的。
-
局部作用域(Local) : 只能在函数内部使用;他是局部变量,是属于函数内部声明的变量,这里要注意,形参也是局部变量,不过全局定义的函数却是全局变量。
-
块级作用域(Block):在大括号(分支 + 循环)里面声明的变量
<script>
//全局变量
let num = 10
//fn本身还是全局变量
function fn(a,b) {
//函数 : 局部作用域
let age = 20
console.log(age)
}
fn(10,20)
//块级作用域: 分支 + 循环
for (let i = 1; i <= 5; i++) {
console.log(i)
}
for(let i = 1;i<=10;i++){
console.log(i)
}
</script>
作用域链:默认情况下,js代码处于全局作用域(顶级作用域:0级),当我们声明一个函数的时候,会开辟一个局部作用域(1级)。如果在局部作用域中又声明一个函数,就会形成新的局部作用域(2级),以此类推,就形成了链式结构,称之为作用域。
//全局作用域 0级
let num = 10
function fn(){
//局部作用域 1级
// let num = 20
console.log(num)//20
function fn1(){
//2级
// let num = 30
console.log(num)//30
}
fn1()
}
console.log(num)//10
fn()
变量访问作用域链的规则:就近原则。就是如果自己的作用域有声明这个变量,就在自己的作用域找这个变量的值,如果没有,就访问上级作用域,如果有就访问,还没有就继续找,一直到最顶级(0级),还是找不到就会报错 xxx is not defined,这个变量没有定义。