一、全局作用域
不在函数内部作用域和块级内部作用域外的作用域
二、函数作用域
在函数内部的作用域
函数作用域在函数创建时就已经确定(词法作用域)和调用位置无关
三、块级作用域
在花括号
{}
内部的作用域,对象的{}
不属于块级作用域
3.1、注意:
- 只要是js可执行的代码,就至少有一个作用域
- 对象的
{}
不属于块级作用域,像for(){}
,if(){}
,else{}
,try{}
,cath(){}
等等的花括号才是块级作用域- 对象的
{}
的作用域是什么作用域,取决于定义对象代码语句所处的作用域,比如对象定义在全局作域下,那么对象的{}
的作用域就是全局作用域
四、作业域链
4.1、什么是自由变量
如下代码中,console.log(a)要得到a变量,但是在当前的作用域中没有定义a(可对比一下b)。当前作用域没有定义的变量,称为为 自由变量 。
var a = 100
function fn() {
var b = 200
console.log(a) // 这里的a 就是一个自由变量 // 100
console.log(b)
}
fn()
4.2、作用域链
自由变量会顺着作用域向父作用域找,如果父级也没有找到,再一层一层向上寻找,直到找到全局作用域还是没找到,就宣布放弃。这种一层一层的关系,就是作用域链 。
4.3、例子1
<script>
let num = 10;
function fn() { //外部函数
let num = 20;
return function fun() { //内部函数
console.log(num);
}
}
const funn = fn()
funn() // 20 ,一级一级访问
</script>
4.4、例子2
<script>
let num = 10;
function fn() { //外部函数
return function fun() { //内部函数
console.log(num);
}
}
const funn = fn()
funn() // 10 ,一级一级访问
</script>