- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
浅析Javascript闭包的特性
浅析Javascript闭包的特性
Javascript闭包的定义非常晦涩——闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落。这些外部执行域的非持久型变量神奇地保留它们在闭包最初定义(或创建)时的值(深连结)。
简单来说,Javascript闭包就是在另一个作用域中保存了一份它从上一级函数或作用域取得的变量(键值对),而这些键值对是不会随上一级函数的执行完成而销毁。周爱民说得更清楚,闭包就是“属性表”,闭包就是一个数据块,闭包就是一个存放着“Name=Value”的对照表。就这么简单。但是,必须强调,闭包是运行期概念,一个函数实例。
Javascript闭包的实现,通常是在函数内部再定义函数,让该内部函数使用上一级函数的变量或全局变量。
ECMAScript认为使用全局变量是一个简单的Javascript闭包实例。
var?sMessage?=?Hello?World;? ?
function?sayHelloWorld(){? ?
alert(sMessage);? ?
};? ?
sayHelloWorld();?
但它完成没有体现Javascript闭包的特性……
现在比较让人认同的Javascript闭包实现有如下三种
with(obj){? ?
//这里是对象闭包? ?
}(function(){???? ?
//函数闭包? ?
})()try{? ?
//...? ?
}?catch(e)?{? ?
//catch闭包?但IE里不行? ?
}?
附上今天在无忧看到的问题:
要求:
让这三个节点的Onclick事件都能正确的弹出相应的参数。
ul?? ?
li?id=a1aa/li?? ?
li?id=a2aa/li? ?
li?id=a3aa/li? ?
/ul? ?
script?type=text/javascript? ?
ul? ?
li?id=a1aa/li? ?
li?id=a2aa/li? ?
li?id=a3aa/li? ?
/ul? ?
script?type=text/javascript? ?
for(var?i=1;?i??4;?i++){? ?
var?id?=?document.getElementById(a?+?i);? ?
id.onclick?=?function(){? ?
alert(i);//现在都是返回4???? ?
}? ?
}? ?
/script?
客服果果的解答:
for(var?i=1;?i??4;?i++){???? ?
var?id?=?document.getElementById(a?+?i);??? ?
/*??? ?
这里生成了一个匿名函数并赋值给对象?id_i;??? ?
*/??? ?
id.onclick?=?function(){???????? ?
/*???????? ?
这个i来源于局部变量,无法以window.i或者obj.i的形式在后期引用,???????? ?
只好以指针或者变量地址方式保存在这个匿名函数中,???????? ?
这就是传说的闭包,所以所有这个过程中生成的事件句柄都使用引用???????? ?
的方式来持久这个变量,也就是这些匿名函数共用一个变量i;???????? ?
*/??????? ?
alert(i);???? ?
};? ?
};?
局部变全局
for(var?i=1;?i??4;?i++){? ?
var?id?=?document.getElementById(a?+?i);??? ?
id.i=i;//这个i有了根??? ?
id.onclick=function(){???????? ?
alert(this.i)???? ?
};? ?
};1.for(var?i=1;?i??4;?i++){??? ?
var?id?=?document.getElementById(a?+?i);?? ?
window[id.id]=i;//这个i有了根?? ?
id.onclick=function(){??????? ?
alert(window[this.id]);??? ?
};? ?
}?
产生一对一的更多Javascript闭包
for(var?i=1;?i??4;?i++){?? ?
var?id?=?document.getElementById(a?+?i);?? ?
id.onclick?=?new?function(){?????? ?
var?i2=i;//这个i是闭包的闭包????? ?
return?function(){????????? ?
alert(i2);????? ?
}??? ?
};? ?
}
您可能关注的文档
最近下载
- 人教版英语八年级上Unit3整单元课件(共190张ppt).ppt
- 茶叶加工工(高级、三级)理论考试复习题库(含答案).docx
- 数据通信基础认知—数据通信系统的基本概念.pptx
- 2024年宠物食品行业分析报告:从零食到主粮,从代工依赖到海内外均衡发展.pdf
- 床上用品供货及售后服务方案.docx VIP
- 一种双偏振雷达降水优化反演方法.pdf VIP
- 亲子农场体验园设计.pptx
- 刘京焕财政学模拟测试题.doc VIP
- 荣威-360-产品使用说明书-荣威360PLUS 1.5L 自动尊享版-CSA7154ADAC-荣威360用户手册-2018.7.11.pdf
- 财政学原理刘京焕陈志勇李景友第十章节.ppt
文档评论(0)