您好、欢迎来到现金彩票网!
当前位置:秒速快三计划 > 属性闭包 >

jQuery闭包之浅见从面向对象角度来理解

发布时间:2019-06-07 06:17 来源:未知 编辑:admin

  本篇的标题虽然是jQuery闭包之浅见...,但实际上本篇涉及的多半是javascript闭包相关内容,之所以写这个标题,完全是因为自己平常用jQuery写前端习惯了。还有一个原因是:javascript闭包很容易造成内存泄漏, 而jQuery已经自动为我们规避、处理了由闭包引发的内存泄漏。

  javascript的闭包是这样定义的:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

  在javascript中,有一种情况是,一个函数中包含了另外一个内部函数:

  就像我们需要实例化类来调用类的实例方法一样,在javasript中,当我们在外部函数之外调用内部函数的时候,我们把此时的内部函数叫做闭包,相当于面向对象的实例方法。

  以上情况,内部函数的作用域是在外部函数之内,当在外部函数之外调用内部函数的时候,自然就报错。

  以上情况,内部函数的作用域是在外部函数之内,当在外部函数之内调用内部函数,自然不会报错。

  以上情况,全局变量globalInner相当于面向对象的委托,当把内部函数赋值给全局变量,调用委托方法就会调用内部函数。

  以上情况,我们可以看到,内部函数不仅可以赋值给全局变量,还可以赋值给局部变量。

  就像面向对象的方法会用到类的字段,内部函数也会用到变量,接下来体验变量的作用域。

  当第二次执行内部函数,JavaScript垃圾回收机制把先前的temp回收,并释放与该temp对应的内存,再创建一个新的内部函数变量temp

  所以,每次调用内部函数,内部函数的变量是全新的。也就是说,内部函数的变量与内部函数同生共灭。

  当我们在外部函数之外调用内部函数的时候,这时的内部函数就叫做闭包,可以理解为面向对象的实例方法。闭包与外部函数变量的外部环境是外部函数,他俩与外部函数同生共灭。

  一个外部函数中可以有多个内部函数,当调用闭包的时候,多个闭包共享外部函数变量:

  闭包在jQuery中最常见的应用是,当Document加载完毕再执行jQuery部分:

  可见,$(document).ready()的参数就是一个匿名外部函数,匿名函数内的函数是内部函数。

  可见,2个input元素的click事件看作是内部函数,共享同一个外部函数变量counter。

  可当点击每个div的时候,原本以为控制器台应该显示:0, 1, 2,但实际显示的始终是3,为什么?

  --i看作是匿名外部函数的自由变量,当页面加载完毕后,i就变成了3。div的每次点击看作是内部函数的闭环,而所有的闭环都共享了值为3的这个变量。

  我们可以使用jQuery的each()方法来解决以上问题,遍历一个数组,每一次遍历元素值都不同:

  内存泄漏可以狭隘地理解为:应用程序中变量对应一块内存,由于某些原因(比如代码上的漏洞),始终没有对变量及时实施手动或自动垃圾回收,内存没有得到及时释放,造成内存泄漏。

  以上,A有一个属性指向B,B有一个属性指向C,当A被回收的时候,没有依赖B的对象,B随之被自动回收,C也被最终回收。

  以上,A有一个属性指向B, B有一个属性指向C,而C又有一个属性指向B,B和C之间存在循环引用。当A被回收之后,B和C是无法自动被回收的,在JavaScript中应该手动处理回收。

  以上,outVal是在内存中的一个对象,而内部函数innerFunction同样是内存中的一个对象。对象outVal的属性fn指向内部函数,而内部函数通过console.log(outerVal)引用outVal对象,这样outVal和内部函数存在循环引用的情况,如果不手动处理,就会发生内存泄漏。

  如果,我们在内部函数中不显式引用outerVal对象变量,会造成内存泄漏吗?

  答案是:会的。因为,当内部函数被引用、调用的时候,即使内部函数没有显式引用外部函数的变量,也会隐式引用外部函数变量。

  而在jQuery中,类似的写法就不用担心内存泄漏了,因为jQuery为我们做了自动处理来规避内存泄漏。

  与闭包相关的包括:变量的作用域、javascript垃圾回收、内存泄漏,需在实践多体会。

http://isaegil.net/shuxingbibao/185.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有