JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)
function my(){
}
my(); //别忘记调用
(function(){ //这里第一个左括号是必须的,如果不写,JavaScript解析器会将
//function解析成函数声明语句,使用的话解析成函数定义表达式
}()) //这里的()的作用是,函数定义完毕后立即调用它。
function a(){
var a1=2;
}
function b(){
var b1=3;
}
function b(){
var b1=3;
function a(){
var a1=2;
alert(b1);
}
a();
}
b(); //结果=>3
这样就实现了?然并卵啊!闭包的现实意义在哪?当然“真正”有意义的闭包并不是这样。
闭包的作用:外部函数可以读取函数内部的变量。
另一个就是让这些变量的值始终保持在内存中。
function b(){
var b1=3;
return function (z){
var a1=2;
return alert(b1+z);
}
}
var a=b();
a(2); //=>5
这样我们就在全局作用域中调用了b1这个内部变量。(个人理解,如果有误还请指教。)
匿名函数被返回后,它的作用域链被初始化为包含b()函数的活动对象和全局变量对象。这样匿名函数就可以访问b()中的所有变量。
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=function(){
return i;
}
}
return arry;
}
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=function(num){
return function(){
return num;
}
}
}
return console.log(arry);
}
ca();
上面强制闭包错误!返回的都是function(num){}。
下面提供正确的方式:
//第一种方式
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=(function(i){
return i;
})(i);
}
return console.log(arry[5]);;
}
ca();
//->5
//第二种方式
function ca(){
var arry=[];
for(var i=0;i<10;i++){
arry[i]=function(){
var n=i;
return n;
}();
}
return console.log(arry[8]);
}
ca();
//->5
我们没有直接把闭包函数赋值给数组,而是定义了一个匿名函数,并将立即执行该匿名函数的结果赋值给数组。
这两种方式都能得到自己想要的结果。
这里在举个实际中的例子:
<!doctype html>
<title></title>
<meta charset="utf-8"/>
<script type="text/javascript">
window.onload = function(){ //方法一
var lists = document.getElementsByTagName("li");
for(var i=0,l=lists.length; i < l; i++){
lists[i].onclick=(function(i){// 强制闭包
return function(){
alert(i)
}
})(i)
} //方法二
var lists = document.getElementsByTagName("li");
for(var i=0,l=lists.length; i < l; i++){
lists[i].onclick=function(){
var n=i;
return function(){
alert(n)
}
}()
}
}
</script>
<ul>
<li id="a1">aa</li>
<li id="a2">aa</li>
<li id="a3">aa</li>
</ul>
var f=new Fuction("x","y","return x*y;");
//->等价于
var f=function(x,y){
return x*y
}
5.constructor属性
var F=function(){} //这是一个函数对象
var p=F.prototype; //这是F相关联的原型对象
var c=p.constructor; //true
c===F //对于任意函数F.prototype.constructor==F
var o=new F(); //创建类F的一个对象
o.constructor===F //true,constructor属性指代这个类
6.多catch从句
try{
//这里肯呢个会抛出多种类型异常
throw 1;
}
catch(e if e instanceof ReferenceError){
//这里处理引用错误
}
catch(e if e==="quit"){
//这里处理抛出的字符串是"quit"的情况
}
catch(e if typeof e==="string"){
//处理其他字符串的情况
}
catch(e){
//处理剩下的异常
}
finally{
//finally从句正常执行
}
--Log----------------------------------------------------------------------------------------------
2015-10-21 添加操作 闭包
JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)的更多相关文章
- JavaScript权威设计--跨域,XMLHttpRequest(简要学习笔记十九)
1.跨域指的是什么? URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a. ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- JavaScript权威设计--JavaScript函数(简要学习笔记十)
1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"lik ...
- java jvm学习笔记十二(访问控制器的栈校验机制)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...
- (C/C++学习笔记) 十二. 指针
十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...
- Python学习笔记(十二)—Python3中pip包管理工具的安装【转】
本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...
- JavaScript权威设计--Window对象之Iframe(简要学习笔记十四)
1.Window对象属性的文档元素(id) 如果在HTML文档中用id属性来为元素命名,并且如果Window对象没有此名字的属性,Window对象会赋予一个属性,它的名字是id属性的值,而他们的值指向 ...
- JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)
1.事件冒泡与事件捕获 2.事件与事件句柄 3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处: 1.每个函 ...
随机推荐
- 使用CSS3实现一个3D相册
CSS3系列我已经写过两篇文章,感兴趣的同学可以先看一下CSS3初体验之奇技淫巧,CSS3 3D立方体效果-transform也不过如此 第一篇主要列出了一些常用或经典的CSS3技巧和方法:第二篇是一 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter
中间件的注册除了可以借助Startup对象(DelegateStartup或者ConventionBasedStartup)来完成之外,也可以利用另一个叫做StartupFilter的对象来实现.所谓 ...
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- BridgePattern(桥接模式)
/** * 桥接模式 * @author TMAC-J * 应用于多维度方案 * 用组合的形式代替继承 * 符合单一职责原则 * 一个类只有一个引起他变化的原因 * 增加程序灵活性 */ public ...
- js 入门级常见问题
写在前面:以下是个人总结的关于js常见的入门级的问题一些总结. js是有 ECMAScript Dom Bom 三部分组成. 1,undefined,NaN,Null,infinity 1) unde ...
- 如何理解DT将是未来IT的转型之路?
如今的IT面临着内忧外患的挑战. 一方面,企业多多少少都建立了信息化,有些企业或集团甚至会有数几十个分公司,包含直销.代理.零售以及第三方物流等多种业态.越是复杂的业务,信息化建设越困难,比如运用大量 ...
- iOS从零开始学习直播之2.采集
直播的采集由采集的设备(摄像头.话筒)不同分为视频采集和音频采集,本篇文章会分别介绍. 1.采集步骤 1.创建捕捉会话(AVCaptureSession),iOS调用相机和话筒之前都需要创建捕 ...
- A*算法应用[转]
转自:http://www.cnblogs.com/zhoug2020/p/3468167.html 这是一篇十分精彩/易懂的博客,感谢原博主!本文通过自己的理解在原博文基础上突出一些重点字眼,句子. ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...