一:官方解释
官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
二:个人理解:
闭包就是函数内部return 一个函数;
(变量产生一些作用域的变化)
贴代码:
一个很经典的东西
function callback() { var a=0; return function () { a++; console.log(a); } } var callone=callback(); callone(); callone();
输出结果:1
2
这个或许很多人都有疑惑,接着
function callback() { var a=0; return function () { a++; console.log(a); } } var callone=callback(); console.log(callone);
这个的输出结果是一个数组,---- [Function]
我们知道callone是什么东西之后呢,改写一下上面的代码,
var a=0; var callone=function () { a++; console.log(a); } callone(); callone();
这个的输出结果是 :1
2
写到这估计很多人都能明白了,这个闭包例子简单粗暴的说就是a变成了一个全局变量,多次赋值a并且输出。( a就会一直在内存中)
三:
接下来贴几个经常面试出现的代码搞一下:
function callone() { var arr=[]; for(var i=0;i<3;i++){ arr[i]=function () { return i; } } return arr; } var calltwo=callone(); for (var i=0;i<3;i++){ console.log(calltwo[i]()); }
输出结果:3 3 3
把上面的代码搞一下:
var arr=[]; for(var i=0;i<3;i++){ arr[i]=function () { return i; } } for(var m=0;m<3;m++){ console.log(arr[m]()); }
结果是:3 3 3
但是这次改写我犯了很多错:首先贴上犯错代码
var arr=[]; for(var i=0;i<3;i++){ arr[i]=function () { return i; } }
console.log(i);//第二次改写 for(var i=0;i<3;i++){ console.log(arr[i]()); }
结果: 0 1 2
这个代码乍一看和上面的一样,但是运行结果却不一样,原因是我忘记了for声明中的i 声明为全局变量,导致运行循环的时候对arr进行的重新赋值,得出了错误的结果。
闭包很重要的一部分就是变量提升和匿名函数,建议提前把这一部分学好!
建议大家看一下http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html?20120612141317#comments的文章 阮一峰大佬的 写的很基础易懂
最后附上一个代码:
代码来自https://cnodejs.org/topic/567ed16eaacb6923221de48f (侵权删)
function fun(n,o){ console.log(o); return { fun:function(m){//[2] return fun(m,n);//[1] } } } var a=fun(0); a.fun(1); a.fun(2); a.fun(3); var b=fun(0).fun(1).fun(2).fun(3); var c=fun(0).fun(1); c.fun(2); c.fun(3);
结果是:
undefined
0
0
0
undefined
0
1
2
undefined
0
1
1
有兴趣的同学可以看一看!
博主18毕业,求与nodejs相关的实习 有意者联系QQ576961950