封闭空间的主要思想在于:

  • JS中给一个变量外面加小括号,是不改变任何结果的。比如
var show = function(){ //定义一个名字为show的函数
);
};
show(); //调用名字为show的函数

上面的show()也可以写成(show)(),然后因为show本身又代表function(){alert(12);};,所以左边括号里的show完全可以用函数本身代替而写成(function(){alert(12);})()。而右边的括号里可以传参数。 
这样做的好处至少有:

  • 可以在定义函数的同时又可以执行它,省去命名的步骤;
  • 封闭空间里定义的变量是这个空间里的局部变量。 
    看下面这个典型错误的选项卡例子,是运用封闭空间来解决for循环里事件函数里i的问题
; i<aBtn.length; i++) {
aBtn[i].onclick = function(){
; i<aBtn.length; i++) {
aBtn[i].className = '';
aDiv[i].style.display = 'none';
}
this.className = 'active';
aDiv[i].style.display = 'block'; //这行的i就是有问题的,因为在没有点击aBtn[i]之前而执行里面代码的时候i早就变成了3,而不是我们要的每次循环得到的那个i
};
}

上述代码是错的,可以想到,如果for循环里的代码如果是一个函数执行,那函数执行就能和for循环同步执行,每次循环i,只要把i传进里面函数的参数里,就能保证同时递增(严格来讲也不是同步,这个以后再说)。所以完全可以用封闭空间的方式来直接执行函数,并把i当做参数传进封闭空间函数即可。

; i<aBtn.length; i++) {
(function(index){ //在定义的时候就要求传一个index变量
aBtn[i].onclick = function(){
; i<aBtn.length; i++) {
aBtn[i].className = '';
aDiv[i].style.display = 'none';
}
this.className = 'active';
aDiv[index].style.display = 'block'; //这里的index就相当于每次递增的i
};
})(i); //这里将每次递增的i传给封闭函数里的参数
}

上面的例子,最外层for循环里的代码是一个封闭空间函数,它在定义的同时就执行了,而且是通过传参的方式将每次递增的i传进了函数,所以可以每次执行i都不同。

  • 封闭空间的注意事项 
    一般在工作中,用封闭空间可以很好地避免变量重名的问题,比如下面这个例子
//下面是员工A写的代码
];
oBtn.onclick = function(){
alert(oBtn.value);
};
//下面是员工B写的代码,但是他们2个人是分别在不同的文件里写的,而他也定义了oBtn,所以把前面的覆盖了
];
oBtn.onclick = function(){
alert(oBtn.value);
};

为了避免这样的情况出现,可以用封闭空间的方法,把各自的变量封闭为局部变量

//下面是员工A写的代码
;(function(){
];
oBtn.onclick = function(){
alert(oBtn.value);
};
})();
//下面是员工B写的代码
;(function(){
];
oBtn.onclick = function(){
alert(oBtn.value);
};
})();

这时每个函数里的oBtn只在各自的函数里起作用。 
另外每个(function()前加一个;的目的是,在实际工作中,不同人写不同的部分,最后会压缩在一个文件中,而这个;是为了防止前面的一个人写的代码忘了用;结束,而导致后面的代码出错,但是即使2个;;连在一起也不会有问题。

【巩固】JS中的封闭空间的更多相关文章

  1. 拾取模型的原理及其在THREE.JS中的代码实现

    1. Three.js中的拾取  1.1. 从模型转到屏幕上的过程说开 由于图形显示的基本单位是三角形,那就先从一个三角形从世界坐标转到屏幕坐标说起,例如三角形abc 乘以模型视图矩阵就进入了视点坐标 ...

  2. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  3. 【详解】JS中的作用域、闭包和回收机制

    在讲解主要内容之前,我们先来看看JS的解析顺序,我们惯性地觉得JS是从上往下执行的,所以我们要用一个变量来首先声明它,来看下面这段代码: alert(a); var a = 1; 大家觉得这段代码有什 ...

  4. 5.0 JS中引用类型介绍

    其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...

  5. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

  6. JS中给正则表达式加变量

    前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下.   一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...

  7. js中几种实用的跨域方法原理详解(转)

    今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...

  8. 关于js中的this

    关于js中的this this是javascript中一个很特别的关键字,也是一种很复杂的机制,学习this的第一步就是要明白this既不指向函数自身也不指向函数的词法作用域,this实际上是函数被调 ...

  9. 表值函数与JS中split()的联系

    在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来. split()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递 ...

随机推荐

  1. HTML table、form表单标签的介绍

    1. <table>标签 1.1说明: 在HTML 中定义表格布局. 1.2格式: <table> <caption></caption> <tr ...

  2. Android 如何通过代码模拟按钮点击 延时函数

    View.performClick();   比如: private Button mButton01;    mButton01 = (Button)findViewById(R.id.myButt ...

  3. thinkPHP CRUD操作

    数据访问 以 nation 表为例 方法一  => select() ①造模型对象 $naiton = D('Nation');   //也可以使用M()方法 ②查询所有 $a = $natio ...

  4. js 常见弹出框学习

    模拟系统的弹出框 系统自带的弹出框 总结 链接  http://blog.csdn.net/anhuidelinger/article/details/17024491 参考这个网站学习模态框的动态弹 ...

  5. python 中md5 和 sha1 加密, md5 + os.urandom 生成全局唯一ID

    首先先来介绍一下md5 和 sha1 的概念 MD5 MD5的全称是Message-Digest Algorithm 5(信息-摘要算法).128位长度.目前MD5是一种不可逆算法. 具有很高的安全性 ...

  6. Hbuilder与svn快速连接并在手机上测试页面

    大家好,今天讲一下Hbuilder怎样与svn连接在一起,并且在移动端上面做真是的页面测试. 1,打开Hbuilder软件,在工具中,安装插件,找到svn插件安装. 2.点击文件,导入,从svn中检测 ...

  7. ViewStub的简单用法和说明

    最近无意间知道了ViewStub,所以特地的去了解了一下 都知道ViewStub是一个不可见的,大小为0的View,实际上跟include差不多,但是ViewStub要更加节约资源.被称为是" ...

  8. MySQL数据库之------DOS命令行的基本操作

    1.   进入D盘的如下路径: 按住   ctrl+shift  ,右键,选择在此处打开命令行窗口.出现图2.   图   1  图 2 2. .     3.   图 3  4.    图 4   ...

  9. 『U3D学习』破坏神回忆图<二>技能系统

  10. java的VO和PO的用途

    最近在搞一个项目,用到了 springMVC,加深了我对VO和PO的理解,有感而发. 1 写在之前的提示 VO == Value Object PO == Persistant Object VO对应 ...