闭包
前言
闭包:指函数变量被隐藏在作用域链之内,这时看起来像是函数将变量“包裹”起来了(函数对象通过作用域相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机文献中成为闭包)。闭包是一个可以重用的对象,又保护对象不被篡改的一种机制。
作用域和作用域链
作用域:作用域是一个变量的可用范围,其实质是一个保存变量的对象,使用作用域可以避免不同范围的变量相互干扰。
全局作用域:在 JavaScript 中的全局作用域就是 windows。优点是可以重复使用,随处可用,但会造成全局污染(全局污染指在两个脚本中存在同名的变量,当这两个脚本在同一个窗口中运行时,由同名变量造成的混乱。)
函数作用域:临时创建的活动对象 AO(activation object),该对象包含了函数的所有局部变量、命名参数、参数集合以及 this,当运行上下文被销毁时活动也会被销毁(闭包形成的原因就是因为活动对象被引用着无法销毁而导致的)。优点是不污染全局,但不可重复使用且仅在函数内才可以使用。
程序执行的原理