javaScript的闭包!

举报
搞前端的半夏 发表于 2022/06/30 21:50:45 2022/06/30
【摘要】 闭包闭包是一个与其词法环境绑定在一起的函数。词法环境是函数可以访问其父环境中变量的环境闭包允许从函数内部访问外部函数的内容!要理解这两句话,我们首先需要了解执行上下文是如何创建的以及调用堆栈是如何工作的!每当javaScript函数运行时,都会创建调用执行上下文global execution context并将其放入堆栈中。每当调用函数时,都会创建函数的执行上下文并将其放入调用堆栈!栈时...

闭包

闭包是一个与其词法环境绑定在一起的函数。

  • 词法环境是函数可以访问其父环境中变量的环境
  • 闭包允许从函数内部访问外部函数的内容!

要理解这两句话,我们首先需要了解执行上下文是如何创建的以及调用堆栈是如何工作的!

  • 每当javaScript函数运行时,都会创建调用执行上下文global execution context并将其放入堆栈中。
  • 每当调用函数时,都会创建函数的执行上下文并将其放入调用堆栈!
  • 栈时LIFO(后进先出)结构!放在栈顶部的数据先出来!
  • 每当一个函数被放入 stack 时,它都有关于它当前在代码中的位置的信息,即它的词法环境。

例子:

function outerFunc(){
    var a=7;
    function innerFunc(){
     console.log(a)
    }
    return innerFunc;
}

var output= outerFunc();
console.log(output);
output();
  • 在outerFunc内部有一个个名为 innerFunc() 的函数,我们使用函数名,将它作为变量返回!
  • InnerFunc() 内部没有变量声明或者函数定义!
  • 如果我们在屏幕截图中看到输出,则在第 10 行,整个 innerFunc() 被返回。
  • 如果我们将返回值作为 function 调用,我们可以看到 innerFunc() 正在执行,虽然 outerFunc() 在第 7 行结束,但 a 的值可以通过词法作用域在innerFunc环境中访问,然后在第 4 行a's打印值。

图片.png

图片.png

function outerFunc(){                         
var a=7;                 
function innerFunc(){    
console.log(a)           
}                       
 a=100                   
 return innerFunc;       
}                       

var output= outerFunc(); 
console.log(output);     
output();

  • 这题的答案可能会有人觉得是7,但由于第 6 行,所有事情都发生了变化,并且输出为 100
  • 在第 10 行,调用了 outerFunc(),它返回了与示例 1 相同的 innerFunc() 的值
  • 不同的是在第 6 行,值a被重新初始化为 100。虽然 innerFunc() 可以访问a,我们在示例 1 中看到的值。它不存储 a的值,但具有对a的地址的引用。
  • 截至目前,a的地址与之前相同,但值现在更改为 100。因此,输出更改。

图片.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。