• 闭包-问题大全


    提纲挈领:

    今天维护代码时多次发现:函数调用时后面有两个括号,如:

    在这里插入图片描述

     平常进行函数调用时用的都是一个括号,查了一个资料才知道:原来知道一个函数里返回的是另外一个函数,就可以用两个括号了,如:

    结果图:

    输出的结果是:在这里插入图片描述

    正文开始:

    题目1:

    1. var name = "The Window";
    2.   var object = {
    3.     name : "My Object",
    4.     getNameFunc : function(){
    5.       return function(){
    6.         return this.name;
    7.       };
    8.     }
    9.   };
    10. console.log(object.getNameFunc()());
    11. //The Window

    注释:getNameFunc前面没有使用var关键字,它是一个全局变量,而不是局部变量。所以它读的是全局变量the window,返回的this.name是the window。

    题目2【题目1的延伸】

    1. var name = "The Window";
    2.   var object = {
    3.     name : "My Object",
    4.     getNameFunc : function(){
    5.       var that = this;
    6.       return function(){
    7.         return that.name;
    8.       };
    9.     }
    10.   };
    11. console.log(object.getNameFunc()());
    12. //My Object

    题目1和题目2的小结:

    1.在函数内部声明

    在函数内部使用var声明变量时,声明的是局部变量,函数外部是无法访问的。没有用var声明的变量是全局变量,函数外部是可以访问到的。

    情况1:【在函数内部使用var声明变量时,函数外面访问不到】

    1. const fun = () => {
    2. //使用var声明
    3. var a = 1
    4. //不使用var声明
    5. q = 1
    6. }
    7. fun()
    8. console.log(a) //a is not defined
    9. //console.log(q) //1

     情况2:【在函数内部没有var声明变量时,函数外面可以访问】

    1. const fun = () => {
    2. //使用var声明
    3. var a = 1
    4. //不使用var声明
    5. q = 1
    6. }
    7. fun()
    8. //console.log(a) //a is not defined
    9. console.log(q) //1

    2.全局作用域声明变量

    在全局作用域下使用var声明变量是不可删除的,不使用var声明的变量是可以删除,它为全局变量中的一个属性,一般在浏览器中全局变量为windows。

    1. var a = 1
    2. b = 2
    3. c = 3
    4. console.log(a) //1
    5. console.log(b) //2
    6. delete a //无法删除,会报错
    7. delete b //删除
    8. console.log(a) //1
    9. console.log(b) //b is not defined
    10. console.log(window.c) //3

    题目3:

    1. var nAdd;
    2. function out(){
    3. var n = 999;
    4. nAdd = function(){
    5. n ++; //++在后,先执行后自增
    6. // 如果是上一行的代码是console.log(n++),则输出999
    7. console.log(n)//1000 此时n已经自增为1000
    8. }
    9. return function(){
    10. console.log(n);
    11. }
    12. }
    13. var getN = out();
    14. getN();//999 因为nAdd尚未执行
    15. nAdd();//1000
    16. getN();//1000 nAdd执行后,n为1000

    我的解释:只有nAdd()函数执行之后return的值才会间接的改变掉外部函数的局部变量n值。

  • 相关阅读:
    都说了能不动就别动,非要去调整,出生产事故了吧
    基于Springboot社区人口管理系统的分析与实现
    【无标题】
    实战模拟│程序员应该学会的开源共建
    对卷积的一点具象化理解
    Text-to-Image最新论文、代码汇总
    NLP学习:深入NLP
    嵌入式开发:构建连接设备的5个技巧
    Centos7 crontab 环境变量不生效
    Spring Data JPA 之 @Entity 回调方法
  • 原文地址:https://blog.csdn.net/qq_59110215/article/details/127688623