浅析Javascript闭包的特性

简介:

Javascript闭包的定义非常晦涩——闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落。这些外部执行域的非持久型变量神奇地保留它们在闭包最初定义(或创建)时的值(深连结)。

简单来说,Javascript闭包就是在另一个作用域中保存了一份它从上一级函数或作用域取得的变量(键值对),而这些键值对是不会随上一级函数的执行完成而销毁。周爱民说得更清楚,闭包就是“属性表”,闭包就是一个数据块,闭包就是一个存放着“Name=Value”的对照表。就这么简单。但是,必须强调,闭包是运行期概念,一个函数实例。

Javascript闭包的实现,通常是在函数内部再定义函数,让该内部函数使用上一级函数的变量或全局变量。

ECMAScript认为使用全局变量是一个简单的Javascript闭包实例。

 
  1. var sMessage = "Hello World";     
  2. function sayHelloWorld(){     
  3. alert(sMessage);     
  4. };     
  5. sayHelloWorld(); 

但它完成没有体现Javascript闭包的特性……

现在比较让人认同的Javascript闭包实现有如下三种

 
  1. with(obj){     
  2. //这里是对象闭包     
  3. }(function(){        
  4. //函数闭包     
  5. })()try{     
  6. //...     
  7. catch(e) {     
  8. //catch闭包 但IE里不行     

附上今天在无忧看到的问题:

要求:

让这三个节点的Onclick事件都能正确的弹出相应的参数。

 

 
  1. <ul>      
  2. <li id="a1">aa</li>      
  3. <li id="a2">aa</li>     
  4. <li id="a3">aa</li>     
  5. </ul>     
  6. <script type="text/javascript">     
  7. <ul>     
  8. <li id="a1">aa</li>     
  9. <li id="a2">aa</li>     
  10. <li id="a3">aa</li>     
  11. </ul>     
  12. <script type="text/javascript">     
  13. for(var i=1; i < 4; i++){     
  14. var id = document.getElementById("a" + i);     
  15. id.onclick = function(){     
  16. alert(i);//现在都是返回4        
  17. }     
  18. }     
  19. </script> 
 
  1. for(var i=1; i < 4; i++){        
  2. var id = document.getElementById("a" + i);       
  3. /*       

 
  1.  
  2. 这里生成了一个匿名函数并赋值给对象 id_i;       
  3. */       
  4. id.onclick = function(){            
  5. /*            
  6. 这个i来源于局部变量,无法以window.i或者obj.i的形式在后期引用,            
  7. 只好以指针或者变量地址方式保存在这个匿名函数中,            
  8. 这就是传说的闭包,所以所有这个过程中生成的事件句柄都使用引用            
  9. 的方式来持久这个变量,也就是这些匿名函数共用一个变量i;            
  10. */           
  11. alert(i);        
  12. };     
  13. };  

局部变全局

 
  1. for(var i=1; i < 4; i++){     
  2. var id = document.getElementById("a" + i);       
  3. id.i=i;//这个i有了根       
  4. id.onclick=function(){            
  5. alert(this.i)        
  6. };     
  7. };1.for(var i=1; i < 4; i++){       
  8. var id = document.getElementById("a" + i);      
  9. window[id.id]=i;//这个i有了根      
  10. id.onclick=function(){           
  11. alert(window[this.id]);       
  12. };     
  13. }  

产生一对一的更多Javascript闭包

 
  1. for(var i=1; i < 4; i++){      
  2. var id = document.getElementById("a" + i);      
  3. id.onclick = new function(){          
  4. var i2=i;//这个i是闭包的闭包         
  5. return function(){             
  6. alert(i2);         
  7. }       
  8. };     

 

 本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/390985,如需转载请自行联系原作者

相关文章
|
23天前
|
JavaScript
闭包(js的问题)
闭包(js的问题)
12 0
|
1月前
|
设计模式 JavaScript 前端开发
js开发:请解释闭包(closure)是什么,以及它的用途。
闭包是JavaScript中的关键特性,允许函数访问并操作外部作用域的变量,常用于实现私有变量、模块化和高阶函数。私有变量示例展示了如何创建无法外部访问的计数器;模块化示例演示了封装私有变量和函数,防止全局污染;高阶函数示例则说明了如何使用闭包创建能接收或返回函数的函数。
16 2
|
1月前
|
存储 缓存 JavaScript
|
1月前
|
自然语言处理 JavaScript 前端开发
探索JavaScript中的闭包:理解其原理与实际应用
探索JavaScript中的闭包:理解其原理与实际应用
19 0
|
1天前
|
测试技术
js_防抖与节流(闭包的使用)
js_防抖与节流(闭包的使用)
7 0
|
4天前
|
JavaScript 前端开发 Linux
JavaScript 的跨平台特性
【4月更文挑战第22天】JavaScript 的跨平台特性
19 8
|
24天前
|
人工智能 前端开发 JavaScript
【前端设计】HTML+CSS+JavaScript基本特性
【前端设计】HTML+CSS+JavaScript基本特性
|
30天前
|
JavaScript 前端开发 Java
深入剖析 JavaScript 闭包
深入探讨JavaScript闭包,了解其定义、特性、优缺点及作用。闭包是函数与其引用环境的组合,允许内层函数访问外层作用域,常驻内存可能导致内存泄露。优点包括创建私有变量,缺点则涉及内存使用。闭包在变量搜索中遵循从内到外的规则,并影响变量的作用域和生存周期。理解闭包有助于优化代码并避免性能问题。
21 1
|
1月前
|
自然语言处理 前端开发 JavaScript
深入理解JavaScript中的闭包与作用域链
在JavaScript编程中,闭包和作用域链是两个非常重要的概念,它们对于理解代码的执行过程和解决一些特定问题至关重要。本文将深入探讨JavaScript中闭包和作用域链的原理和应用,帮助读者更好地理解这些概念并能够在实际项目中灵活运用。
|
1月前
|
前端开发 JavaScript Java
除了变量提升,JavaScript还有哪些特性?
【2月更文挑战第20天】【2月更文挑战第61篇】除了变量提升,JavaScript还有哪些特性?