本文主要是介绍js闭包简述-不要太去强调闭包,不然你会晕的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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中的闭包”,我应该能拿满分了吧?
这篇关于js闭包简述-不要太去强调闭包,不然你会晕的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!