开发者社区> 问答> 正文

你有真正了解闭包吗?

你有真正了解闭包吗?

展开
收起
社区秘书 2019-12-16 13:47:18 826 0
1 条回答
写回答
取消 提交回答
  • 
    首先列举了一个例子:
    
    //创建一个名为 quo 的构造函数
     //它构造出带有 get_status 方法和 status 私有属性的一个对象
     var quo = function (status) {
     return {
     get_status:function () {
     return status;
     }
     };
     };
     //构造一个 quo 实例
     var myQuo = quo("amazed");
     document.writeln(myQuo.get_status());
    这个 quo 函数被设计成无须再前面加上new 来使用, 所以名字也没有首字母大写。当我们调用 quo 时,它返回包含get_status 方法的一个新对象。该对象的一个引用保存在myQuo中。即使quo 已经返回了,但是get_status 方法仍然享有返回 quo 对象的 status 属性的特权。get_status 方法并不是访问该参数的一个副本,它访问的就是该参数本身。这是可能的,因为该函数可以访问它被创建时所处的上下文环境。这就是闭包。
    
    image.png
    
                          1.闭包可以简单的理解为函数嵌套。
                        2.每一个函数都可以理解为闭包。
                       3.闭包不是一句话可以简单概括的。
    闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数,仍以前面的 createComparisonFunction() 函数为例,注意加粗的代码。
    
    function createComparisonFunction(propertyName) {
     return function (object1, object2) {
     var value1 = object1[propertyName];
     var value2 = object2[propertyName];
    
     if(value1 < value2){
     return -1;
     } else if(value1 > value2){
     return 1;
     } else {
     return 0;
     }
     };
     }
    在这个例子中,突出的那两行代码是内部函数(一个匿名函数)中的代码,这两行代码访问了外部函数中的变量 propertyName 。即使这个内部函数被返回了,而且是在其他地方被调用了,,但它仍然可以访问变量 propertyName 。之所以还能够访问这个变量,是因为内部函数的作用域链中包含createComparisonFunction() 的作用域。要彻底搞清楚其中的细节,必须从理解函数被调用的时候都会发生什么入手。 本次给大家推荐一个免费的学习群,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。 对web开发技术感兴趣的同学,欢迎加入Q群:864305860,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。 最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。
    
    2019-12-16 13:47:56
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
函数对象 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载