打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
闭 包

闭包

我没有自觉地学习过JavaScript。我必须快点了解它,因为我发现如果没有它,在实际工作中编写AJAX应用程序的准备就不会充分。开始,我感到我的编程水平好像降了几个级别。(JavaScript!我的C++朋友会怎么说?)但一旦我克服最初的障碍,我就发现JavaScript实际上是功能强大、表现力极强而且非常简练的语言。它甚至具有其它更流行的语言才刚刚开始支持的功能。

 

JavaScript的更高级功能之一是它支持闭包,这是C#2.0通过它的匿名方法支的功能。闭包是当内部函数(或C#中的内部匿名方法)绑定到它们外部函数的本地变量时所发生的运行时现象。很明显,除非此内部函数以某种方式被外部函数访问,否则它没有多少意义。实例可以更好说明这一点。

 

假设需要根据一个简单条件一个数字序列,这个条件是:只有大于100的数字才能通过筛选,并忽略其余数字。为此,可以编写类似图8中的函数。

Figure 8 根据谓词筛选元素

Js代码
  1. <script>   
  2. function filter(pred, arr)    
  3. {   
  4.     var len = arr.length;   
  5.     var filtered = []; // shorter version of new Array();   
  6.     // iterate through every element in the array...   
  7.     for(var i = 0; i < len; i++)    
  8.     {   
  9.         var val = arr[i];   
  10.         // if the element satisfies the predicate let it through   
  11.         if(pred(val))    
  12.         {   
  13.             filtered.push(val);   
  14.         }   
  15.     }   
  16.     return filtered;   
  17. }   
  18.   
  19. var someRandomNumbers = [12, 32, 1, 3, 2, 2, 234, 236, 632,7, 8];   
  20. var numbersGreaterThan100 = filter   
  21. (   
  22.     function(x)    
  23.     {    
  24.           return (x > 100) ? true : false;    
  25.     },    
  26.     someRandomNumbers   
  27. );   
  28. // displays 234, 236, 632   
  29. alert(numbersGreaterThan100);   
  30. </script>  

 

但是,现在要创建不同的筛选条件,假设这次只有大于300的数字才能通过筛选,则可以编写下面这样的函数:

Js代码
  1. var greaterThan300 = filter   
  2. (   
  3.     function(x)    
  4.     {    
  5.          return (x > 300) ? true : false;    
  6.     },    
  7.     someRandomNumbers   
  8. );  

 然后,也许需要筛选大于50、25、10、600 如此等等的数字,但作为一个聪明人,您会发现它们全部都有相同的谓词"greater than",只有数字不同。因此,可以用类似下面的函数分开各个数字:

Js代码
  1. function makeGreaterThanPredicate(lowerBound)    
  2. {   
  3.     return function(numberToCheck)    
  4.     {   
  5.         return (numberToCheck > lowerBound) ? true : false;   
  6.     };   
  7. }  

 这样,您就可以编写以下代码:

Js代码
  1. var greaterThan10 = makeGreaterThanPredicate(10);   
  2. var greaterThan100 = makeGreaterThanPredicate(100);   
  3. alert(filter(greaterThan10, someRandomNumbers));   
  4. alert(filter(greaterThan100, someRandomNumbers));  

 通过观察函数makeGreaterThanPredicate返回的内部匿名函数,可以发现,该匿名内部函数使用lowerBound,后者是传递给makeGreaterThanPredicate的参数。按照作用域的一般规则,当makeGreaterThanPredicate退出时,lowerBound超出了作用域!但在这里,内部匿名函数仍然携带lowerBound,甚至在makeGreaterThanPredicate退出之后的很长时间内仍然如此。这就是我们所说的闭包;因为内部函数关闭定义它的环境(即外部函数的参数和本地变量)。

  开始可能感觉不到闭包的功能很强大。但如果应用恰当,它们就可以非常有创造性地帮您将想法转换成代码,这个过程非常有趣。在JavaScript中,闭包最有趣的用途之一是模拟类的私有变量。

下一节:模拟私有属性

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JavaScript程序员都需要知道的4个数组方法
JSON in JavaScript
js的15种循环遍历,你掌握了几种?
javascript递归的实际应用场景
js和jquery的数组过滤grep()和filter()数组去重去nullundefind
记一次笔试题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服