闭包
闭包是有权访问另一个函数作用域中变量的函数。
创建闭包最常见的方式是在函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。
闭包的两个常用用途:
- 在函数的外部可以访问到函数内部的变量,通过使用闭包,可以在外部调用闭包函数,从而在外部访问到函数内部的变量,可以通过这种方式来创建私有变量。
- 使已经结束的函数上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量的引用,所以这个变量对象不会被回收。
作用域
- 全局作用域
最外层函数和其外面定义的变量拥有全局作用域;
window对象属性拥有全局作用域;
过多使用全局作用域会污染全局命名空间。 - 函数作用域
函数作用域声明函数内部的变量;
内层作用域可以访问到外侧作用域,反之不行。 - 块级作用域
let和const指令可以声明块级作用域,由{}包裹的代码片段。
作用域链
在当前作用域中查找需要变量,如果没有,就以此向父级作用域查找,该关系就是作用域链。
执行上下文
在执行一段js代码之前,需要先解释代码,解释的时候会先创建一个全局执行上下文环境,先把变量先赋值undefined,函数声明拿出,这一步执行完了才开始正式执行程序。
在函数执行前,会有变量定义,函数声明,this,arguments,函数参数。