• 闭包


    闭包这东西,真的是很难搞,之前也有学习,但是现在才发现自己一直理解的都是错的,所以今天我把这写难搞的例子先一个一个写出来,然后剖析其中的原理,以便于我们深一步的理解;
    闭包的两大好处:
        1.可以读取函数内部的变量;
        2.可以将变量的值始终保存在内存中;

    案例1:
    var n = 2;

    function f1(){
        alert(n);  //2
    }
    f1();

    这个例子因为函数内部并没有定义变量n,所以体现闭包的一个特性:函数内部可以直接读取全局变量,这里n在全局已经被赋值,所以结果是2;

    但是请看第二个;
    案例2:
    var n=2 ;

    function f1(){
        alert(n);    //undefined

        var n =99;
        alert(n);    //99
    }
    f1();

    看到相信你一定懵逼了,因为我是这样的。。。。这是之前一个面试我的大牛出的最简单的一个题目。这里解释一下为什么是undefined和99这两个结果吧,你一定会想第一个例子不是已经证明了第一个弹出的是2因为函数内部还未定义的时候函数内部可以获取到全局变量的赋值,这个想法是对的,但是在这个函数内部,因为下面定义的var n =99;已经说明这个变量在函数内部已经自己定义过了,只是这个定义是隐藏起来的,指导var n =99;又给他赋值99,才使得他有自己真正的值,在此之前他是这样的:
    {
    var n;    //这个在最开始是隐藏的,未定义
    alert(n);   //undefined

    var n =99;   //重新赋值
    alert(n);        //99
    }

    案例3:
    请看这三个例子,如果函数内定义没有加var,那么定义的就是全局函数
    函数内部定义的n,外部不能够使用;
    function f1(){
        var n = 9;
    }
    console.log(n);       // undefined

    函数没有调用,所以n并没有赋值;
    function f1(){
        n =9;
    }
    console.log(n);     // undefined


    调用函数,因为函数内没有使用定义var n=9,则定义的为全局函数,所以结果为9;
    function f1(){
        n =9;
    }
    f1();

    console.log(n);     // 9


    案例4:
    案例 f2就是闭包函数
    function f1(){
        var n=9;

         function f2(){
        console.log(n);
    }

    return f2;
    }

    var result = f1();
    result();   //9

    我尝试了一下直接返回f1()函数,结果是失败的;

  • 相关阅读:
    jvm09
    jvm08
    jvm07
    求解最长公共子序列问题
    归并排序
    求解N皇后问题
    快速排序算法
    求解0/1背包问题
    求解全排列问题
    求解最大连续子序列和问题
  • 原文地址:https://www.cnblogs.com/eva1963/p/5442150.html
Copyright © 2020-2023  润新知