zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Codeforces 177G2 Fibonacci Strings KMP 矩阵
    Codeforces Gym100187C Very Spacious Office 贪心 堆
    Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
    AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)
    BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
    NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
    Codeforces 555C Case of Chocolate 其他
    NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
    NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
    NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
  • 原文地址:https://www.cnblogs.com/lilight/p/7478656.html
Copyright © 2011-2022 走看看