作用域
函数变量在哪里声明定义就在哪里被调用
1593337964669.png
1593338478569.png
总结:当函数中定义一个变量,这个变量在这个函数=={ }==内都可以被使用,比如==fn1==中声明的变量==a1==,在其=={ }==内都可以使用,也可以在==fn2==和==fn3==中使用,但是如果在==fn2==和==fn3==中声明的变量就不能在==fn1==中使用,因为超过了他们函数=={ }==,超过了他们的作用域范围。
- 作用域分类
- 全局作用域:在代码中直接被定义的变量,没有函数的约束,在全局都可以使用
- 函数作用域:在函数中定义的变量超过这个函数句不能被使用
- 块级作用域(ES6 新增,var没有块级作用域这个概念的)
//ES6块级作用域
if(true){
let x = 100
const y =50
}
console.log(x,y)//会报错
自由变量
- 一个变量在当前的作用域没有定义,但被使用了
- 向上级作用域,一层一层依次寻找,直到找到为止
- 如果全局作用域都没有找到,则报错 xx is not defined
总结例如:就是说==fn3==中发现有一个==a1==或者==a==变量没有声明定义,则会从==fn3==一层一层的往上寻找直到全局作用域。
闭包
函数作用域应用的特殊情况,有两种表现
- 函数作为参数被传递
//函数被作为参数
function print(fn){
let a = 200
fn()
}
let a = 100
function fn(){
console.log(a)
}
print(fn) //100
- 函数作为返回值被返回
//函数作为返回值
function create(){
let a = 100
return function(){
console.log(a)
}
}
let fn = create()
let a = 200
fn() //100
总结:所有的自由变量的查找,是在函数定义的地方,依次向上级作用域查找,不是在执行的地方