1.什么是作用域
作用域指程序中定义变量的区域,决定了当前执行代码对变量的访问权限,内层作用域可以访问外层作用域,外层作用域不可访问内层作用域,作用域又分为全局作用域和函数作用域。
- 全局作用域:全局作用域为程序最外层作用域,一直存在。
- 函数作用域:函数作用域在函数被定义时创建,当遇到
return
或}
销毁,包含在父级函数作用域/全局作用域中。
2.作用域链
当可执行代码访问变量时,会先查找本地作用域,如果找到目标变量就会返回,否则就会往父级作用域查找,直到全局作用域。
3.词法作用域(静态作用域)
函数在定义的时候,作用域就确定了,和在哪里执行没有关系
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar(); // 打印全局作用域的1
4.块级作用域
当使用let
和const
来定义变量时就会创建块级作用域,{...}
花括号之间的区域就是块级作用域
5.闭包
函数内部定义的函数,被返回出去并在外部被调用,或者函数作为参数传递,此时就会产生闭包,相当于携带一个背包,背包中能够访问被返回函数被定义时所在作用域的所有变量。
// 函数作为返回值
function create () {
const a = 200
return function () {
console.log(a)
}
}
const a = 100
let fn = create()
fn() // 200
// 函数作为参数被传递
function create (fn) {
const a = 200
fn()
}
const a = 100
function fn() {
console.log(a);
}
create(fn) // 100