javascript中的闭包

首先闭包是一个什么概念?
其实我们平时使用的return 就是一个闭包的概念,但是return不是真正意义上的闭包。首先我们来看一个例子:
这里写图片描述
这是一段很普通的代码,定义了一个函数,函数里定义了2个变量,随后我们把这2个变量通过json的格式返回出去。在外面,我们定义了一个变量来接收这个函数所返回的数值,并进行输出。结果如下:
这里写图片描述
虽然这段代码很简单,但是体现出了一个闭包的概念:属性和函数的外调。
闭包就是一个内部函数里变量作用域生命周期的延续。说白了就是可以访问一个函数里面的私有属性。闭包的另外一个展现形式,就是回调函数。回调函数在项目开发中非常的多,我们举个例子来解说回调函数:
这里写图片描述
这里写图片描述
这里写图片描述
注意,这个打印的显示200,再是6。也就是说,2种方法都可以读取到fn函数内部的私有属性。
我们会发现,对比上面的代码,这里多出了一个callback。而这个callback就是我们所说的回调函数。在fn函数里,有这么一行代码:callback(c),之前我们说过,函数也是一种数据类型,而在这里,我们的fn函数的第三个形参,就是以一个函数的数据类型所展示的形参。而变量c作为一个实参,在fn函数中已经被传入到callback这个函数中去,于是,在调用fn函数的时候,我们在fn函数的第三个参数位置定义了一个有实际意义上的函数。该函数的参数就是fn函数中私有属性c。
但是,这个私有属性c并没有被绑定到window对象中去,该属性仍然是fn函数的私有属性,只不过这个属性进行了外调而已。我们借用到了fn函数中的私有属性的值来进行操作。这就是闭包。在项目开发中,由于整个项目的周期可能几个月,甚至几年。开发人员也不一定从始至终都是固定的。所以,在开发jsp或者html页面时,如果存在引用多个js文件,难免会出现定义变量名重复的bug,这是一个很可怕的错误。而且我们不一定找得出来。闭包很好的解决了这一个问题,因为局部属性和全局属性并不会冲突,但又可以被调用到。
既然有了这个回调函数,那么有一些东西我们就可以让用户自己来实现了,举个例子:
我们先定义3个按钮。并且给他们定义click方法:
这里写图片描述
输出结果如下:
当我们分别点击3个按钮时:
这里写图片描述
这里写图片描述
这里写图片描述
注意,这里的document.getElementById(“button1”)我最后再解释一下,就是获取id为button1 的元素。.onclick 是将这个元素绑定一个click事件,触发事件后执行的代码就是后面的匿名函数里的代码。这里的onclick 等同于 在元素里写 ,这都是一个效果。
接下来,我们对代码进行封装:
这里写图片描述
效果也是跟上图的效果是一样的,但是我们发现一个问题,正如按钮的value一样,我们发现这3个按钮其实所运行的代码结果是不一样的,一个是加法,一个是减法,一个是乘法,那这是不是意味着我们需要在fn函数里进行判断呢?其实这个时候,回调函数就派上了用场:
这里写图片描述
在这里,我们对fn函数进行了回调函数的定义,当我们调用fn这个函数的时候,第一个参数是我们需要进行click的id,第二个参数就是回调函数。在这里,回调函数需要进行一个判断,如果回调函数不为空,则执行这个回调函数。这样,我们就相当于进行了一个接口的定义,具体的实现让用户自己来实现。同样的,我们也可以把click这个事件封装进去,使代码更加的方便灵活:
这里写图片描述
这里的click,mouseover,mouseout 分别代表的是点击,鼠标移上去和鼠标移开所触发的事件,由于截图工具无法截到鼠标的运作轨迹,所以这里就不放截图了,大家可以参照代码自己去试一下。充分的了解闭包的概念。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值