java闭包的到底有什么用处_javascript闭包是什么_javascript闭包有什么作用

JavaScript 闭包究竟是什么

1.简单的例子

首先从一个经典错误谈起,页面上有若干个div, 我们想给它们绑定一个onclick方法,于是有了下面的代码

《div id=“divTest”》

《span》0《/span》 《span》1《/span》 《span》2《/span》 《span》3《/span》

《/div》

《div id=“divTest2”》

《span》0《/span》 《span》1《/span》 《span》2《/span》 《span》3《/span》

《/div》

$(document).ready(funcTIon() {

var spans = $(“#divTest span”);

for (var i = 0; i 《 spans.length; i++) {

spans[i].onclick = funcTIon() {

alert(i);

}

}

});

很简单的功能可是却偏偏出错了,每次alert出的值都是4,简单的修改就好使了

var spans2 = $(“#divTest2 span”);

$(document).ready(funcTIon() {

for (var i = 0; i 《 spans2.length; i++) {

(funcTIon(num) {

spans2[i].onclick = function() {

alert(num);

}

})(i);

}

});

2.内部函数

让我们从一些基础的知识谈起,首先了解一下内部函数。内部函数就是定义在另一个函数中的函数。例如:

function outerFn () {

functioninnerFn () {}

}

innerFn就是一个被包在outerFn作用域中的内部函数。这意味着,在outerFn内部调用innerFn是有效的,而在outerFn外部调用innerFn则是无效的。下面代码会导致一个JavaScript错误:

function outerFn() {

document.write(“Outer function《br/》”);

function innerFn() {

document.write(“Inner function《br/》”);

}

}

innerFn();

不过在outerFn内部调用innerFn,则可以成功运行:

function outerFn() {

document.write(“Outer function《br/》”);

function innerFn() {

document.write(“Inner function《br/》”);

}

innerFn();

}

outerFn();

2.1伟大的逃脱

JavaScript允许开发人员像传递任何类型的数据一样传递函数,也就是说,JavaScript中的内部函数能够逃脱定义他们的外部函数。

逃脱的方式有很多种,例如可以将内部函数指定给一个全局变量:

var globalVar;

function outerFn() {

document.write(“Outer function《br/》”);

function innerFn() {

document.write(“Inner function《br/》”);

}

globalVar = innerFn;

}

outerFn();

globalVar();

调用outerFn时会修改全局变量globalVar,这时候它的引用变为innerFn,此后调用globalVar和调用innerFn一样。这时在outerFn外部直接调用innerFn仍然会导致错误,这是因为内部函数虽然通过把引用保存在全局变量中实现了逃脱,但这个函数的名字依然只存在于outerFn的作用域中。

也可以通过在父函数的返回值来获得内部函数引用

947a332af72855c62d9b36867f907ecd.png

function outerFn() {

document.write(“Outer function《br/》”);

function innerFn() {

document.write(“Inner function《br/》”);

}

return innerFn;

}

var fnRef = outerFn();

fnRef();

这里并没有在outerFn内部修改全局变量,而是从outerFn中返回了一个对innerFn的引用。通过调用outerFn能够获得这个引用,而且这个引用可以可以保存在变量中。

这种即使离开函数作用域的情况下仍然能够通过引用调用内部函数的事实,意味着只要存在调用内部函数的可能,JavaScript就需要保留被引用的函数。而且JavaScript运行时需要跟踪引用这个内部函数的所有变量,直到最后一个变量废弃,JavaScript的垃圾收集器才能释放相应的内存空间(红色部分是理解闭包的关键)。

说了半天总算和闭包有关系了,闭包是指有权限访问另一个函数作用域的变量的函数,创建闭包的常见方式就是在一个函数内部创建另一个函数,就是我们上面说的内部函数,所以刚才说的不是废话,也是闭包相关的 ^_^

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值