作用域
它是指对某一变量和函数具有访问权限的代码空间
在js中只有两种作用域
1.全局作用域:script标签内部的区域就是全局作用域
2.局部作用域:函数大括号内部的区域就是局部作用域
在js中只有函数可以划分作用域,因此每个函数的大括号内部都是一个局部作用域
因此我们称局部作用域为函数作用域
- 全局变量 声明在全局的变量
- 全局作用域就是全局变量起作用的范围
- 局部变量 在函数内部声明的变量
- 局部作用域就是局部变量起作用的范围
<script>
//script标签中的空间就是全局作用域
//全局作用域
//a变量就声明在了全局作用域,就是一个全局变量
var a; //全局变量
a(a)
a = 10;
function a(a) {
//函数大括号内局部作用域
//在函数内部声明的变量就是局部变量
let b = 10;//局部变量
console.log(a)
a = 100
}
console.log(a)
console.log(b) //b is not defined
var c;
console.log(c)//undefined
</script>
不同作用域中变量和函数的访问权限
- 局部作用域中声明的变量和函数只能在局部作用域中访问
- 全局作用域中声明的变量和函数可以在全局任意访问
- 两个同级的布局作用域之间不能互相访问对方内部的变量
- 全局作用域不能访问局部里面的变量
由以上几条推出
- 子级作用域能访问父级作用域的变量和函数
- 父级作用域不能访问子级的变量和函数
- 同级作用域之间不能互相访问变量和函数
作用域链
会先在当前作用域查找变量,当前没有向上一级查询
1.当前有使用当前的变量。
首先,函数不调用不执行,所以调用了fun函数,在fun函数中,有一个函数a,调用了函数a,打印了a,调用a会执行a函数,里面var了一个a赋值为10,所以在函数a中打印a出的结果为10,在fun函数中打印a的结果是函数a这个函数体。
2.当前没有向上一级查找变量,一直到全局作用域为止,如果还是没有会报错,xxx is not defined。
var c = 100;//全局作用域中有c
function num(b) {
//上一级函数局部作用域也没有c
var a = 10;
function sum() {
console.log(a + b + c) //当前函数局部作用域没有c
}
sum()
}
// num(10) //10+10+100
num(10) //120