前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前端面试 【JavaScript】— 闭包产生的原因?

前端面试 【JavaScript】— 闭包产生的原因?

作者头像
越陌度阡
发布2021-11-19 16:02:19
2240
发布2021-11-19 16:02:19
举报

要弄清闭包产生的原因,首先要明白作用域链的概念。在ES5中只存在两种作用域:全局作用域和函数作用域,当访问一个变量时,解释器会首先在当前作用域查找标示符,如果没有找到,就去父作用域找,直到找到该变量的标示符或者不在父作用域中,这就是作用域链。值得注意的是,每一个子函数都会拷贝上级的作用域,形成一个作用域的链条。

比如:

代码语言:javascript
复制
var a = 1;
function f1() {
  var a = 2;
  return function f2() {
    console.log(a);
    // 2
  }
};

var num = f1();
num();

在这段代码中,f1 的作用域指向有全局作用域 (window) 和它本身,而 f2 的作用域指向全局作用域 (window)、f1 和它本身。而且作用域是从最底层向上找,直到找到全局作用域window为止,如果全局还没有的话就会报错。

这里 num 会拿到父级作用域中的变量,输出2。因为在当前环境中,含有对函数 f2 的引用,f2 恰恰引用了window、f1和f2的作用域,因此f2可以访问到f1的作用域的变量。

闭包产生的本质就是,当前环境中存在指向父级作用域的引用。

那是不是只有返回函数才算是产生了闭包呢?

回到闭包的本质,我们只需要让父级作用域的引用存在即可,因此我们还可以这么做:

代码语言:javascript
复制
var f2;
function f1(){
  var a=2
  f2 = function(){
    console.log(a);  
    // 2
  }
};
f1();
f2();

让f1执行,给f2赋值后,等于说现在f2拥有了window、f1和f2本身这几个作用域的访问权限,还是自底向上查找,最近是在f1中找到了a,因此输出2。

在这里是外面的变量f2存在着父级作用域的引用,因此产生了闭包,形式变了,本质没有改变。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-11-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档