作用域和闭包
作用域
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。 作用域就是一个独立的区域,让变量不会外泄、暴露出去。作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
作用域类型:
- 全局作用域
- 函数作用域
- 块级作用域
作用域链
如果在当前作用域中没有找到变量,再一层一层向上寻找,直到找到全局作用域还是没找到,就宣布放弃。这种一层一层的关系,就是 作用域链 。
作用域在定义时就确定,并且不会改变。
执行上下文
执行上下文(Execution Context)是指在运行时创建的一个环境,用于存储当前执行的代码的所有相关信息。每当代码开始执行时,JavaScript 引擎都会创建一个新的执行上下文。
执行上下文包含:
- 变量对象
- 作用域链
- this 指针
执行上下文在运行时确定,随时可能改变;
闭包
能够访问其他函数内部变量的函数,被称为 闭包。
闭包的形成发生在当一个内部函数引用了其外部函数的变量,并且这个内部函数在外部函数执行完毕后仍然可以被访问到时。
闭包的形成条件:
函数嵌套
内部函数引用外部函数的局部变量