当前位置: 首页 > 科技观察

助你掌握JavaScript:什么是闭包?

时间:2023-03-14 21:21:28 科技观察

1.词法域LexicalClosure闭包是编程语言LexicalScoping的专有属性,它不同于动态作用域。也就是说,函数在定义过程中执行和调用的是它的“变量域”,而不是它被调用时的变量域。Javascript函数的初始状态不仅包括函数体,还包括函数定义过程所在的定义域。与大多数现代编程语言一样,JavaScript使用词法范围。这意味着函数是使用定义时有效的变量范围执行的,而不是调用它们时有效的变量范围。为了实现词法作用域,JavaScript函数对象的内部状态不仅必须包含函数的代码,还必须包含对函数定义出现的作用域的引用。这种函数对象和范围(一组变量绑定)的组合,函数的变量在其中解析,在计算机科学文献中称为闭包。请参见以下示例:functionmakeCounter(){letcounter=0;returnfunction(){returncounter++;};}letcounter=makeCounter();console.log(counter());console.log(counter());console.log(counter());#+RESULTS::0:1:2对于这个嵌套函数,最有意思的一点是:当外层函数被调用并返回时(这里是makeCounter()),没有办法触及计数器变量了。只有嵌套函数才能独占访问此变量。二、闭包的标准定义开发者通常应该知道通用的编程术语“闭包”。闭包意味着内层函数始终可以访问它所在的外层函数中声明的变量和参数,即使在外层函数返回(生命结束)之后。在某些编程语言中,这是不可能的,或者应该以特殊的方式编写函数来实现它。但如上所述,在JavaScript中,所有函数本质上都是闭包(有一个例外,在“newFunction”语法中有描述)。也就是说:JavaScript中的函数通过隐藏的[[Environment]]属性自动记住它们的创建位置,因此它们都可以访问外部变量。在面试中,前端开发人员通常会被问到“什么是闭包?”正确答案应该是闭包的定义,并解释为什么JavaScript中的所有函数都是闭包,并且可能还有[[Environment]]属性和词法环境如何工作的技术细节。