JavaScript\ActionScript\ruby\php中实现回调函数,以及由此引出的闭包问题的讨论(一)
2009-09-25 00:00:00 来源:WEB开发网那一个函数的作用域会保留到什么时候才会消失呢,如果所有的函数都保留,那岂不是没有内存回收?
根据我看的文章来总结,虽然我不太专业,但是这些观点应该是没有错误的,我用比较通俗易懂的语言来描述:
1.JavaScript中通过一种称作"scope chain " (作用域链)的东西来处理所有的作用域问题,,当你开始创建一个JavaScript应用程序的时候,js引擎首先会给你创建一个顶层的全局对象,这个对象就是window对象,你接下来创建的变量和函数都是这个全局对象的属性,这个对象也是"作用域链"的最顶层.
2.当你创建一个变量的时候,如果是在全局环境中,它就是window的一个属性,如果是在一个函数环境中,它就是这个函数对象的一个属性,创建函数也类似.
3.JavaScript引擎会为每个函数都保存一个作用域链,每次执行一个函数的时候引擎都会为此函数创建一个执行环境,然后将此函数的属性添加到作用域链的末端,这样就不会造成全局变量和局部变量的混淆了.
4.小插曲:this 关键词指向方法的调用者,而不是以调用对象的属性存在,同一个方法中的this在不同的function调用中,可能指向不同的对象,this关键字之所以在js中让人有种混淆的感觉就是因为js闭包的特殊性,所以理解了闭包就不难理解this的指向了,正如程序中所演示,结果很明确.
5.综上所述,也就是说其实在js中当一个函数执行之后,它并没有消失,它的属性也被保存下来,而不是每次执行都会初始化局部变量(其他语言就是如此); 其实js中之所以会保存函数的引用,是因为你在外部调用了此函数,这是平常人说的最多的原因,也就是当你在别的地方引用了一个函数后,记得回收它哦,否则这个函数会一直被保存,的确有点抽象,希望可以通过几个例子来消除困惑:
Tags:JavaScript ActionScript ruby
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接