当前位置: 首页 > Web前端 > JavaScript

闭包机制在JavaScript中的起源与应用

时间:2023-03-26 21:33:19 JavaScript

JavaScript中闭包机制的起源与应用前端开发者经常会接触到闭包。说到闭包,很多人首先想到的就是闭包这个概念。函数与其周围状态(词法环境、词法环境)的引用捆绑在一起(或者函数被引用包围)。这种组合是一个封闭包(closure)。也就是说,闭包允许您从内部函数内部访问外部函数的范围。在JavaScript中,无论何时创建一个函数,都会在创建该函数的同时创建一个闭包。至于为什么会有闭包,看了很多解释,感觉答案不太对。很多人都在讲闭包的作用,而不是闭包的由来,JavaScript为什么要引入闭包的机制。之前在维基百科上看过response的解释,这里我给大家转述一下:在JavaScript中,函数是一等公民,可以作为函数的返回值,也可以作为函数的参数传入功能。那么在函数调用的时候,就会出现funarg问题,打破了基于栈的内存分配模式。为了解决这个问题,引入了闭包机制。我们再解释一下funarg问题。在面向战斗的编程语言中,每次调用一个函数时,它的局部变量和函数参数都存储在一个堆栈中,堆栈是使用这些变量的堆栈。从函数返回时,这些变量会弹出(退出)。该模型对于用作函数值的函数有很大的缺陷。例如,函数testFn(){让localVar=10;函数innerFn(innerParam){console.log(innerParam+localVar);}returninnerFn;}letsomeFn=testFn();someFn(20);//30在此示例中,localVar变量对于innerFn函数是免费的。在这个系统中,会采用面向栈的方式来存储局部变量,这意味着当testFn函数返回时,它所有的局部变量都会被从栈中移除。当从外部激活innerFun函数时,这将导致错误。此外,在这种特殊情况下,在面向堆栈的实现中,根本不可能返回innerFn函数,因为innerFn也是testFn的本地函数,然后在testFn返回时被删除。为了解决这个问题,将函数对应的父环境存储在函数内部的[[Scoped]]属性中。这也意味着函数创建后,会在其scpoed属性中保存对应的作用域链。闭包的应用:说的最多的就是防抖和节流,这里可以自行搜索对应的文章。也可以看看我下一篇javascript防抖和节流的实现