闭包(closure)
闭包的形成与变量的作用域及生命周期密切相关,所以在理解闭包前,须理解变量作用域。作用域分全局和局部作用域,是指变量有效访问的范围。变量无权访问子作用域,只能访问自己和父级以上的作用域。 当函数执行时,会创建一个执行期上下文(即作用域)的对象AO(存储在 [[scope]] 中), 一个新的AO指向 定义了一个函数执行时的环境。 函数执行时对应的AO, 是独一无二的,每次调用函数就创建一个OA, 函数执行完毕 AO的指向就会销毁 [[scope]] : 每个函数都是对象,对象中有些属性可访问,有些不可以, [[scope]] 就不可访问,它存储了运行期上下文的集合( [GO,AO] )。 作用域链:就是 [[scope]] 中所存储的AO对象集合,呈链式链接 函数刚定义就存储了 所在环境的执行期上下文,执行时 创建自己的AO function fun ( a ){ console . log ( a ); // function var a = 123 ; function a (){}; console . log ( a ) // 123 函数声明已提升所以不用管 var b = function (){}; console . log ( b ); //function 因为是函数表达式,只提升了 变量b, 这样的函数体不会提升 } fun ( 1 ); //函数 123