一个函数执行前后内存回收,闭包形成的原因,

一、闭包主要涉及到js的几个其他的特性:
作用域链:函数定义创建的时候,作用域寻找使用到的变量的一个索引,而它内部的规则是,从自身本地变量放在最前面,把自身的父级函数中的变量放在其次
在把高一级函数中的变量放在更后面,依次类推直至全局对象为止。当函数中需要查询一个变量的值的时候,js解释器会去作用域链查找,从本地变量中先找
如果没有找到对应的变量,则到下一级作用域链上找,一旦找到变量,则不在继续,如果没有找到需要的变量,则js解释器返回undefined
内存回收机制: 一个函数执行开始时候,会给其中定义的变量划分内存空间保存,以备后面的语句使用,等函数执行完毕返回了这些变量被认为无用的了,对应的
空间也就收回了,下次执行此函数的时候,所有变量回到初始状态,重新赋值使用,但是这个函数内部又嵌套一个函数,而这个函数有可能被外部调用,并且这个函数又使用了外部函数某些变量
这种内存回收机制就出现问题。如果外部函数返回后,又直接调用了内部函数,那么内部函数就无法读取到它所需要的外部函数中变量的值,所以js解释器在遇到函数定义的时候会自动把函数和他可能
使用到的变量一起存起来,也就构建了一个闭包,这些变量将不会被内存回收,只用当内部函数不可能被调用以后,才会销毁这个闭包,而没有任何一个闭包引用的变量才会被下次内存回收启动时回收
局部变量、全局变量
全局变量的作用域是全局的。javascript定义:函数内部声明的变量是局部的,其作用域是局部性,只在函数内部定义,每次执行函数的时都会创建和破坏
全局变量作用域中使用变量可以不用var语句,但在声明局部变量是一定要使用var语句,否则会视为对全局变量的引用。

二、闭包的引起的问题
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
闭包会在父函数外部,改变父函数内部变量的值
posted @ 2018-05-28 11:22  青松&  阅读(1008)  评论(0编辑  收藏  举报