好程序员分享JavaScript闭包特性详解

2025-05-23 04:53:35

1、给个例子。下面这段代码会返回一个函数的引用:如图对于烂瘀佐栾这段代码,C程序员可能会认为sayAlert和say2一样,都是汜枸赓觅指向一个函数的指针。但实际上它俩有一个重要区别: 在JavaScript中,你可以认为一个函数的指针变量同时拥有两个指针。一个指向这个函数,另一个隐藏的指针指向一个闭包。·重点在于你的函数内是否引用的外部变量。在JavaScript中,如果你在一个函数内定义一个新的函数,那么这个新的函数就是一个闭包。 对于C或者其他高级语言,函数执行结束并返回之后,它所占用的栈空间将被释放回收。函数内定义的局部变量将不再可用。但在JavaScript中,并不这样。如上所示,函数执行结束后,它所占用的栈空间并不会被全部回收。

好程序员分享JavaScript闭包特性详解

2、上面是基本理论。更进一步,再来一个例子:如图这个例子说明:闭包中使用的函数局部变量并非是值拷贝,而是引用。say667()执行结束之后number所在的那块内存的值为667,而sayNumber()是在say667()执行结束之后才执行,当它访问number所在的内存时,结果自然也是667。

好程序员分享JavaScript闭包特性详解

3、再进一步,看看用closure时易发生的错误的例子:如图时刻保持清醒:变量是在内存里的,闭包捂执涡扔使用的是内存的引用而不是那块内存的值拷贝。·当你在循环中定义函数(闭包)的时候得小心,它可能并不像你梓脶阗擗最开始想的那样工作。关键有两个:子函数使用的是外部函数的局部变量的引用。循环内只是定义了子函数,并没有执行这个字函数。

好程序员分享JavaScript闭包特性详解

4、最后,来一个最抽象的例子:如图这个例子说明,闭包的创建时机是在函数被调用的时候。每次函数调用都会生成一个新的闭包,也就是一块新的内存区域。因为函数每次调用都会新分配一块栈内存,这是一回事。

好程序员分享JavaScript闭包特性详解

5、最后我自己来总结一下闭包:·函数的局部变量在其他地方被引用闭包有两种基本情况:闭包的返回值是一个函数,它其中使用了该闭包的局部变量;闭包内定义了内部函数,内部函数引用了闭包的局部变量每次函数调用,都会生成一个新的闭包,分配新的内存实例:(滑过tab)

好程序员分享JavaScript闭包特性详解
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢