文章目录
javaScript 闭包的理解
- 什么是闭包
函数执行后返回结果是一个内部的函数,并被外部变量所引用,如果内部函数持有被执行函数作用域的变量,即形成闭包
var f = function () {
var num = 0
return function () {
return num ++
}
}
var fn = f()
fn() // 0
fn() // 1
// fn = null // 释放闭包
可以在内部函数访问到外部函数的作用域,使用闭包,一可以读取函数中的变量,二可以将函数变量存储在内存中保护不被污染。而正因闭包会把函数中的变量值存储在内存中,会对内存有消耗,所以不能滥用闭包,否则会影响网页性能,造成内存泄漏,当不需要使用闭包时,要及时释放内存,可将内层函数对象的变量赋值为null
- 闭包原理
函数执行分成两个阶段(预编译阶段和执行阶段)
预编译阶段:如果发现内部函数使用外部函数的变量,则会在内存中创建一个闭包对象保存对应变量值,如果以存在闭包,则只需要怎家对应属性值即可
执行完阶段,函数执行上下文会被销毁,函数对闭包对象的引用也会被销毁,但其函数内部函数还在持用该闭包引用,所以内部函数可以继续使用外部函数的变量
利用函数作用域连的特性,一个函数内部定义的函数将会包含外部函数的活动对象添加到它的作用域链中,函数执行完毕,其作用域链销毁,但因内部函数中的作用域链仍然在引用这个活动对象,所以其活动对象不会被销毁,直到内部函数被烧毁才会被销毁
优点
- 可以从内部函数访问外部函数的作用域中的变量,企鹅访问的变量长期驻扎在内存中,可以供之后使用
- 避免变量污染全局
把变量存在一个独立的作用域中,作为私有成员存在
缺点
- 对内存消耗有负面影响,因内部函数保存了对外部变量的引用,导致无法被垃圾回收,增大内存的使用量,所以使用不当会导致内存泄漏
- 对处理速度有负面影响,闭包的层级决定了引用的外部变量在查找时经过的作用域链长度
可能获取到意外的值