title: ‘js闭包简述-不要太去强调闭包,不然你会晕的’
date: 2016-05-27
tags: [js,笔记,闭包]
不要太去强调闭包,不然你会晕的
看了几年的闭包了。但是深挖,就一群呵呵呵了。
不信?先拿别人的试题来考一下,看看这题:https://segmentfault.com/q/1010000002916478
js中的闭包内存会泄露吗?
js中的闭包内存如何释放?
js中的闭包如果不用return,还能取出闭包内的变量吗?
js中的闭包中的变量可以通过外部函数改变吗?
js中的闭包中的变量可以销毁吗?
希望这个讨论能找到答案:https://www.zhihu.com/question/19554716
此文仅作为笔记整理,没什么重要的新的内容。
什么是闭包?
(官方)解释:
一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
我的解释:
一个函数里定义的局部变量/私有变量,不扔出去,外部就访问不到,这就是个闭包。除非我return,这个闭包才可以被外部访问。
换个思路:
//我写了几篇博客,我不告诉你,你是看不了。
var o = (function() {
var sherleyBlog = [{
"title": "blog1",
"content": "blog1-content"
}, {
"title": "blog2",
"content": "blog2-content"
}];
//只有我告诉你怎么看得到, 你才可能看到,
//比如这里我告诉你你可以访问第i篇的标题。
//这个闭包才可能被外部访问。
return {
view: function(i) {
return sherleyBlog[i].title;
}
}
}());
//现在你想看?你可以选择看第几篇的标题,因为我只给了你这个接口
o.view(0); //输出:blog1
这个就是js里闭包的一个写法。
现在看最基础的演示:
function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c(); //输出1
我觉得很好理解。仅限于理解js闭包。
一个例子:
DOM:
<button onclick="newdata()">点我</button>
script:
$(document).ready(function() {
function newdata() {
console.log(999);
};
});
没用, newdata is not defined。
如能理解闭包,这里就很好理解了,newdata是被闭包在$(document).ready(function() {}) 里的。
外部是访问不到的。
要解决,方案有:
- 去掉闭包,只写funciton newdata(){}
- 为按钮绑定事件写在包内,而不是写在DOM上。
上面我问: “js中的闭包如果不用return,还能取出闭包内的变量吗?”
答案是能。 可以定义全局变量,然后在闭包中将需要的值赋给这个全局变量。也可以用参数传递值。
如果再让我答一次“简述js中的闭包”,我应该能拿满分了吧?