• 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

  • 相关阅读:
    MongoDB CRUD操作
    mongodb的help类
    MongoDB(六):使用C#代码连接并读取MongoDB数据库
    MongoDB下载、安装、配置、使用,如何下载MongoDB数据库,MongoDB入门
    MongoDB(一):关系型数据库和非关系型数据库
    浅谈.NET中闭包
    JavaScript 对象
    python连接数据库
    个人总结
    课堂建议
  • 原文地址:https://www.cnblogs.com/lilight/p/7478656.html
Copyright © 2020-2023  润新知