鱼C论坛

 找回密码
 立即注册
查看: 2898|回复: 4

[庖丁解牛] 007 ※ 偶遇看不见的#闭包

[复制链接]
发表于 2018-6-28 14:26:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2018-6-28 14:26 编辑

关于为什么要学习JavaScript设计模式,请看:传送门




上一讲小不二利用JS语言特性,实现了对象共有/私有属性和方法,那种溢于言表的喜悦,无法用文字写出来。

giphy.gif


正当小不二准备关电脑睡觉的时候,一个想法突然钻到他的脑子里:
咦,类的静态变量是不是就是通过闭包实现的呢?


PS:关于闭包的教程,鱼油可以参看:0 1 3 3 ★ 得“闭包”者得天下! | 【精英版】

理论上绝对可以通过类的静态变量实现闭包,小不二赶紧又打开编辑器:
  1. var Book = (function(){
  2. //       静态私有变量
  3.         var bookNumber = 0;

  4. //        静态私有方法
  5.         function checkName(name){}

  6. //        返回构造函数
  7.         return function(newID,newName,newPrice){
  8. //            私有变量
  9.             var name,price;

  10. //            私有方法
  11.             function checkID(id){}
  12. //                特权方法
  13.                 this.getName = function(){};
  14.                 this.setName = function(){};
  15.                 this.getPrice = function(){};
  16.                 this.setPrice = function(){};
  17.                
  18. //                公有属性
  19.                 this.id = newID;
  20. //                公有方法
  21.                 this.copy = function(){};
  22.                
  23.                 bookNumber++;
  24.                 if(bookNumber>100)
  25.                     throw new Error("限量发售100本!");
  26.                     
  27. //                    构造器
  28.                     this.setName(name);
  29.                     this.setPrice(price);      
  30.         }
  31.     })();
  32.    
  33.     Book.prototype = {
  34. //        静态公有属性
  35.         isFishcBook : true,
  36. //        静态公有方法
  37.         display:function(){}
  38.     };
复制代码


闭包是有权访问另外一个函数作用域中变量的函数。

就是在一个函数内部创建另外一个函数。

我们将这个闭包作为创建对象的构造函数,这样它即是闭包又是可实例对象的函数。

这就意味着闭包可以访问到类函数作用域中的变量,如代码中的bookNumber变量。

它是一个静态私有变量,原本外面的函数是无法访问滴~

通过闭包,该变量即可被访问到。

giphy.gif


整理完这个思路,小不二想到小甲鱼老师曾经说过:
闭包内部也可以实现一个完整的类,将访问到的属性和方法返回。


小不二将原本放在外面的prototype放到book()方法中:
  1. var Book = (function () {
  2. //       静态私有变量
  3.         var bookNumber = 0;

  4. //        静态私有方法
  5.         function checkName(name) {
  6.         }

  7. //        创建类
  8.         function book(newID, newName, newPrice) {
  9. //            私有变量
  10.             var name, price;

  11. //            私有方法
  12.             function checkID(id) {
  13.             }

  14. //                特权方法
  15.             this.getName = function () {
  16.             };
  17.             this.setName = function () {
  18.             };
  19.             this.getPrice = function () {
  20.             };
  21.             this.setPrice = function () {
  22.             };

  23. //                公有属性
  24.             this.id = newID;
  25. //                公有方法
  26.             this.copy = function () {
  27.             };

  28.             bookNumber++;
  29.             if (bookNumber > 100)
  30.                 throw new Error("限量发售100本!");

  31. //                    构造器
  32.             this.setName(name);
  33.             this.setPrice(price);
  34.         }
  35. //                构建原型
  36.         _book.prototype = {
  37. //        静态公有属性
  38.             isFishcBook: true,
  39. //        静态公有方法
  40.             display: function () {
  41.             }
  42.         };
  43.         return _book;
  44.     })();
复制代码


这样就很像一个整体了,好了,开心的睡觉,迎接明天的新工作!

...


预知后事如何,请看下回分解





课后作业


1、闭包函数有权访问另外一个函数作用域中的变量?(T/F)



答案:
游客,如果您要查看本帖隐藏内容请回复





如果有收获,别忘了评分


                               
登录/注册后可看大图


这位鱼油,如果喜欢JS-设计模式,请订阅 专辑☞传送门)(不喜欢更要订阅



                               
登录/注册后可看大图

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-7-26 11:31:35 | 显示全部楼层
我要看答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-6 16:31:49 | 显示全部楼层
T
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-21 18:28:04 | 显示全部楼层
T
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-21 20:35:18 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-7 02:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表