Javascript中的函数和闭包
这件事的结束,也就是说,不难,在这里我会把我自己的理解关起来。闭包的解释
一个功能性的语言,一个函数可以节省内部数据的状态。一个编译命令语言如C #,因为代码是代码段执行代码段是只读的,函数中的数据只能是静态的数据,函数内的局部变量存储在堆栈中,而该函数结束后,栈被释放,所以局部变量不救。
Javascript使用词法范围,和功能的执行取决于变量的范围,它是定义在函数定义。因此,在Javascript的函数对象不仅保留了代码逻辑,但也有参考作用的电流链。局部变量在函数在Javascript中可以修改,和上次修改状态持续存在,当它重新进入到功能。这是因为局部变量不存储在栈中,而是通过一个对象保存。
决定使用哪个变量由范围链决定。每当它生成函数实例时,它就创建一个对象来存储本地变量,并添加对象来保存本地变量到范围链中。
图中说明了Javascript高级程序设计中的一个图表,尽管这张图片并不能完全解释所有的情况,图中的激活对象是用来保存变量的对象。
简而言之,用Javascript:
闭包:函数实例保存对执行时所需变量的引用,并且不复制当时保存的变量的值(在对象C的实现中,我们可以选择保存时间的值或作为参考)。
范围链:在查找变量时,定位变量的方法是使用VaR作为终止符号。如果链上没有var,它将返回到全局对象。
C #关闭功能是通过将局部变量的引用类型对象成员的编译器的实现。
两。使用闭包
以下是如何使用此特性闭包的一些具体示例:
1。闭包是在定义时生成的。
函数富(函数){ A(函数B)}(函数(C){ })
每一次,我们都有三个函数,A,B和C,它们都是生成的。当执行执行符时,不会引用生成的实例,因此它们将作为一个垃圾销毁。
让我们来验证范围链的定义时,函数的定义,所以这里应该be'local范围
VAR范围=全球范围;功能checkscope(){ var范围=局部范围);函数f(){ } { } { } { }()()
同样的原因:
(函数)函数A(函数){ }(b)函数(c){ }())
经过上述的表达时,也会有三种功能(关闭)产生的A、B和C,因为这是一个匿名函数是立即执行,而三关闭只能生成一次。没有其他参照生成的闭包,那么它将被销毁的垃圾(不必须立即销毁)。
我们写这个,有两个地方
1。避免对全球对象的污染
2。避免同一个函数的多个实例
与下面两个示例相反,闭包是如何保存范围链的:
功能(一){} / /,记忆的方法,对象的创建速度,低开销(功能(原型){ var name = ;功能sayname(警戒){(名字)}(常恩阿么;功能){名称} =_changedprototype.sayname = sayname; / /通过匿名闭包函数执行关闭参考,只会有一个prototype.changename =更改名称;}(a.prototype)=新(VAR)A1 A2);var =新(一);
a1.sayname();();()a2.sayname a1.changename;
--------------------------------------------------------------------------------
功能(B){ / /原型的短链的方法,找到一种快速的方法,但更多的内存消耗,每次调用构造函数产生了2例和1个变量的函数,变量名=b;功能sayname(警戒){(名字)}(更改名称;功能){姓名} =_changed ;this.sayname = sayname; / /参考关闭,每次调用函数B将产生一个新的this.changename =更动名称闭合;} / /如果在新的关键字,函数调用,函数使用一个构造函数。 / /基本上是作为一个构造函数和一个普通的函数调用没有区别。如果你打电话给B(),那么这个对象将绑定到全局对象。新生成的关闭将取代旧的封闭的更动名称和全局对象的sayname属性,所以旧的关闭将被视为垃圾收集。如果 / /构造函数使用new关键字,它会创建一个新的对象(这一点到新的对象)和初始化的sayname新的对象更改名称的属性,所以每一代的关闭将引用和保存。VAR B1 =新的B();b1.sayname();b1.changename();b1.sayname();var B2 =新的B();();()b2.sayname;
三、漏水问题:在编译语言,在文件中的代码段的总功能,并在运行期加载到标记为可执行的内存区域。事实上,我们不认为功能本身有一个生命周期。在大多数情况下,我们认为参考类型数据结构具有生命周期和泄漏问题,如指针,对象,等等。
Javascript中的内存泄漏本质上是一个对象,用于定义函数时保存本地变量,并且由于引用的存在而不能循环使用。
1。有一个循环引用
2,有些对象不能被破坏,如IE6的内存泄漏在DOM和Javascript引擎不能宣布当破坏,所以一些Javascript闭包不会毁灭。这些情况通常都是由Javascript主机对象和Javascript原生对象之间的沟通不畅造成的。