美文网首页前端js学习前端开发专题
关于JS闭包(JS闭包系列1)

关于JS闭包(JS闭包系列1)

作者: 夏夜星语 | 来源:发表于2016-03-19 21:19 被阅读1463次

今天做笔试题,好多关于JS闭包问题,就整理出来,分享一下。

首先,引用下所谓的“官方解释”:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分

请注意加粗部分,会有益于你的理解。

来看例子1:

function a(){
   var i = 1;
   function b(){
      alert(i);
   }
   return b();
}
var c = a(); c;  // a();  

例子2:

function a(){
    var i = 1;
    function b(){
        alert(i);
    }
    return b;
}
var c = a(); c();  // a()();  

上述两个例子的运行结果都是一样的,只不过应该会有很少人用例子2那样结尾a()()那样的写法吧。嘻嘻,我也是今天才发现的。这样写的话,你是不是对函数后面的括号()有了更深的理解呢?

没错,从上面我们可以看出来,函数声明定义时肯定少不了身份证(),而当把一个函数名连带括号()也赋给一个变量,这时的变量其实是指向了这个函数体,也就是说把函数体的指针(地址)赋给了此变量。像上面例子2结尾那样,a()()中的前面部分a()返回值(结果)是一个函数名(指向函数名的指针),也就是说不会执行。所以要在a()后面再加一个(),才会执行,相当于b()。因为a()的返回值是ba()()也就相当于b()

插播结束,返回来说“闭包”问题。

继续看例子:

function a(){
    var i = 1;
    alert(i);
}
function b(){
     alert(i);
}
b();

上面的例子是会报错的:

i 没有定义,(无权访问)
现在返回去继续想“闭包”,你好惊奇的发现,例1和例2里,变量c竟然可以弹出了i!它可是没有在变量c的同级作用域定义过啊!但是——因为“闭包”的存在:函数b()以及函数a里的变量i

注意

上面提到的,“闭包”是包含着函数b()以及变量i,好多网上的文章只简单的提到了函数b(),我认为,结合开篇中的“官方说法”,那种说法是不精确的。(变量也是表达式(闭包)的一部分)

至于闭包的作用,对于垃圾回收机制的好处云云,暂时还没有学习到,后续会继续更新补充。

相关文章

  • 再谈JS闭包(JS闭包系列2)

    这篇文章,来继续谈谈Javascript闭包的剩余问题。因为在上一篇文章中关于JS闭包(JS闭包系列1)主要简单的...

  • JS闭包大结局(JS闭包系列3)

    在上一篇中再谈JS闭包(JS闭包系列2),我详细的介绍了JS中的变量作用域相关的概念,结合第一节关于JS闭包(JS...

  • 关于JS闭包(JS闭包系列1)

    今天做笔试题,好多关于JS闭包问题,就整理出来,分享一下。 首先,引用下所谓的“官方解释”:所谓“闭包”,指的是一...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • JS闭包

    JS闭包 闭包练习

  • JS闭包问题(二)

    在之前的JS闭包问题(一)文章中大概介绍了一下JS闭包,同时讲了闭包与变量之间的问题,今天我们继续聊闭包,聊聊闭包...

  • 一分钟理解js闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 一分钟带你弄懂闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 什么是闭包?几分钟告诉你

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

  • 一分钟带你弄懂闭包

    一分钟理解js闭包,关于js闭包的内容介绍了很多,本文带着大家快速理解什么是js闭包,感兴趣的小伙伴们可以参考一下...

网友评论

  • b566caf4ef13:写的乱七八糟毫无思路,最后一个是闭包么
  • f2b944852d53:第一个实例,有问题吧!return b();最后的c是什么;还是作者想表达其它的。
  • 歐吉桑愛設計:"而当把一个函数名连带括号()也赋给一个变量,这时的变量其实是指向了这个函数,也就是说把函数的指针赋给了此变量"
    我觉得这句话只能针对楼主你给出的例子,因为a()执行返回的是b,b恰巧是函数名。所以感觉"一个函数…这个函数"说法有误,学习中,若我理解有误,还请指正
    夏夜星语:@歐吉桑愛設計 :smile:
    夏夜星语:@歐吉桑愛設計 嗯,只是我的个人说法,其实应该是“函数名”和“函数体”。
  • 我在睡觉:怎么说呢,要不就是你理解错了,要不就是你表达的太不清楚
    我在睡觉:@Charles_ln 你看一下我的文章吧 有一篇js的 你也留言说说你的意见
    夏夜星语: @我在睡觉 那你说说你的理解吧,交流交流
  • 我在睡觉:嗯?感觉有点奇怪
    夏夜星语:@我在睡觉 刚开始理解闭包,是有些困难的。不过多见几次就好了 :smiley:

本文标题:关于JS闭包(JS闭包系列1)

本文链接:https://www.haomeiwen.com/subject/sabhlttx.html