【学】JS中的封闭空间

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

  • JS中给一个变量外面加小括号,是不改变任何结果的。比如

var show = function(){ //定义一个名字为show的函数

    alert(12);

};

show(); //调用名字为show的函数

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

  • 可以在定义函数的同时又可以执行它,省去命名的步骤;
  • 封闭空间里定义的变量是这个空间里的局部变量。 
    看下面这个典型错误的选项卡例子,是运用封闭空间来解决for循环里事件函数里i的问题

 for (var i=0; i<aBtn.length; i++) {

        aBtn[i].onclick = function(){

 for (var i=0; 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当做参数传进封闭空间函数即可。


for (var i=0; i<aBtn.length; i++) {

 (function(index){ //在定义的时候就要求传一个index变量

        aBtn[i].onclick = function(){

 for (var i=0; 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写的代码

var oBtn = document.getElementsByTagName(‘input‘)[0];

oBtn.onclick = function(){

    alert(oBtn.value);

};

//下面是员工B写的代码,但是他们2个人是分别在不同的文件里写的,而他也定义了oBtn,所以把前面的覆盖了

var oBtn = document.getElementsByTagName(‘input‘)[1];

oBtn.onclick = function(){

    alert(oBtn.value);

};

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


//下面是员工A写的代码

;(function(){

 var oBtn = document.getElementsByTagName(‘input‘)[0];

    oBtn.onclick = function(){

        alert(oBtn.value);

 }; 

})();

//下面是员工B写的代码

;(function(){

 var oBtn = document.getElementsByTagName(‘input‘)[1];

    oBtn.onclick = function(){

        alert(oBtn.value);

 }; 

})();

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

时间: 2024-08-05 15:56:17

【学】JS中的封闭空间的相关文章

js中的数据类型

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>    </head>    <body>        <script>            /*             * js中的数据类型             *     一.基本(简单)数据类型  

转:彻底理解js中this的指向,不必硬背

转:http://www.cnblogs.com/pssp/p/5216085.html 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题. 为什么要学习this?

JS中的setTimeout和setInterval的区别

学了许久的javascript,发现其中非常常用的两个函数,就是setInterval和setTimeout函数,对这两个函数的理解,有时觉得很模糊,经过多次的试验,终于对它有了比较深入的了解.定义,setInterval()-- 间隔指定的毫秒数不停地执行指定的代码.setTimeout,延迟两秒调用函数,这个定义非常的简单,但是它并不像字面意思上那么的简 很多人都觉得这两个方法差不多,但是,实际上,他们差的很远呢     因为setTimeout(表达式,延时时间)在执行时,是在载入后延迟指

js中this指向问题

js中this指向问题老生常谈的问题了,在这里说一下我所理解的层面的this. this 指的是当前对象,如果在全局范围内使用this,则指代当前页面window:如果在函数中使用this,则this指代什么是根据当前函数是在什么对象上调用.我们可以使用call和apply改变函数中this的具体指向. console.log(this === window) // true console.log(window.alert === this.alert) // true console.log

JS中的this用法详解

随着对js的深入学习和使用,你会发现它里面包含了很多令人困惑的机制,比如对象.闭包.原型链继承等等,而这其中肯定包含令你现在或者曾经费解的this,如果你不把心一横,花点时间还真不明白这个this的用法,下面这篇文章来详细探讨下: 1.this是啥? 简言之,this是JavaScript语言中定义的众多关键字之一,它的特殊在于它自动定义于每一个函数域内,但是this到底指啥东西却让很多人张二摸不着头脑.这里我们留个小悬念,希望看完这篇文章了你能回答出来this到底指什么. 2.this有啥用?

【转】别再为了this发愁了:JS中的this机制

原文出处: front-Thinking 题记:JavaScript中有很多令人困惑的地方,或者叫做机制.但是,就是这些东西让JavaScript显得那么美好而与众不同.比方说函数也是对象.闭包.原型链继承等等,而这其中就包括颇让人费解的this机制.不管是新手还是老手,不仔细深抠一下还真闹不明白this倒地咋回事捏.今天,我们就一起看一下this倒地咋回事,别再为了this发愁了. 1.this是啥? 简言之,this是JavaScript语言中定义的众多关键字之一,它的特殊在于它自动定义于每

关于如何创建C# ActiveXObject 并在JS中使用的问题

最近在学C#,忽然想到以前在JS中调用的那些OCX控件神马的,就想着做一个,晚上鼓捣了一阵子,现在终于有了点眉目. 1. C# a.创建DLL 首先,打开VS(我用的是2010),创建一个简单的类库,名字numAdd b.然后再类中,创建一个超级简单的测试方法addNum namespace numAdd { public class addNum { public int add(int x,int y) { return x + y; } } } c.在右边的解决方案中,找到Assembly

简说JS中的循环部分

JS中的循环语句是JS基础的最最重要的部分,没有之一,后面所学的其他的一些重要的知识也是需要在此的基础啥古玩城更高级的设置,先来简单的说一下循环的一些知识点. 一.循环结构的执行步骤 1.声明循环变量: 2.判断循环条件: 3.执行循环体操作: 4.更新循环变量: 然后,循环执行2-4,直到条件不成立时,跳出循环. while循环()中的表达式,运算结果可以是各种类型.但是最终都会转为真假,转换规则同if结构. while循环特点:先判断,再执行: do-while循环特点:先执行,再判断:即使

js中的this(二)

在上一篇文章 掌握JS中的“this” (一) 里面, 我们学会了如何正确使用JavaScript中的 this 关键字及其基本原理.我们也知道决定 this 指向哪个对象的关键因素, 是找出当前的执行上下文(execution context).但如果执行上下文不按正常的方式进行设置,问题可能就会变得很棘手.在本文中,我会着重提示在哪些地方会发生这种情况, 以及用什么方式可以弥补. 解决常见问题 在本节中,我们将探讨一些使用 this 关键字时最常见的问题, 并了解如何处理这种情况. 1. 在