JavaScript中的自执行函数和闭包实现过程

本文探讨JavaScript中函数的双重角色,重点讲解自执行函数和闭包的概念。自执行函数允许在执行时立即调用,而闭包则提供内部函数访问外部作用域的能力。通过示例展示了匿名函数和自执行函数的不同写法。

   在JS中,也常常需要复用,将一些常见的操作封装起来,目前看到的很多JS库,比如JQuery就是非常典型的,那么如何在JS中写一个可复用的呢?虽然在JS中有类的这个说法,但是我对这个玩意还是很抵触的,但是存在即合理。JS中的类是通过函数来模拟的,也就是说JS中的函数具有双重角色,用new关键字的将函数视为类,不用new的,它就是一个普普通通的函数。

我们知道,类就是一个数据类型,这个数据类型由属性和方法(函数)组成,如果函数只有属性,没有方法,那么这样的类,一般就单纯的表示为一个数据,增加上一些方法,那么类的功能将会有质的变化。既然在JS中,函数可以表示为类,而类中又有方法,那么在JS中函数内部新定义一个函数,也就不足为怪。

JS中最为强大的内容,我认为除了原型,就是闭包,这里就讨论闭包,闭包其实就是在一个函数内部定义一个新的函数,在执行的时候,会将这个函数返回,也可能是返回一个对象。下面就是一个简单的闭包:

复制代码
  var MathTest = function (x, y) {

        var x = x;
        var y = y;

      var add = function () {

            return x + y;

        }

        return add;

    }
复制代码
 var x = MathTest(3, 4);

        alert(x());

在执行的时候MathTest就是内部的add函数,调用MathTest的时候,相当于执行了x+y,这其实并不起卦,可以将add认为是function内部的一个变量,只是这个变量的值是一个函数,内部的函数是可以访问它的上一个级别的数据,所以我们可以得到正确的值。

所谓匿名函数就是没有名字的函数,形式如下:

function () {
   
    }

既然没有名字,那么如何调用呢:

var b=function () {
   
    }
b()

可以将匿名函数付给一个变量,这个变量现在就充当了这个函数的名称,但是记住,这个不是名称,我只是这么叫,如果觉得不妥的话,可以认为b现在就是这个匿名函数的代表,在用的时候用b就等同于使用右边的函数。除了这种方式,还有就是自执行函数,形式如下:

function(){
          //代码
        })();

自执行函数相当于我们上面两步的结合:

var b=function () {
   
    }
b()

 

js自执行函数的几种不同写法的比较

方法1:最前最后加括号 

复制代码代码如下:

(function(){alert(1);}()); 

这是jslint推荐的写法,好处是,能提醒阅读代码的人,这段代码是一个整体。 
例如,在有语法高亮匹配功能的编辑器里,光标在第一个左括号后时,最后一个右括号也会高亮,看代码的人一眼就可以看到这个整体。 
不过,对于某些写代码不喜欢在行后加分号的同学,也会形成一些坑坑,例如以下代码会报运行错: 
复制代码代码如下:

var a=1 
(function(){alert(1);}()); 


方法2:function外面加括号 

复制代码代码如下:

(function(){alert(1);})(); 

这种做法比方法1少了一个代码整体性的好处。 

方法3:function前面加运算符,常见的是!与void 。 
复制代码代码如下:

!function(){alert(1);}(); 
void function(){alert(2);}(); 


显然,加上“!”或“+”等运算符,写起来是最简单的。 
加上“void ”要敲五下键盘,但是听说有一个好处是,比加"!"少一次逻辑运算。----我只是听说,不明所以。 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值