js闭包的有关问题 1

一:官方解释

官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

二:个人理解:

闭包就是函数内部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

原文地址:https://www.cnblogs.com/lilight/p/7478656.html