javascript 闭包

本文深入探讨JavaScript中的闭包概念及其应用场景,包括闭包如何读取和保存函数内部变量,以及JavaScript变量的作用域规则。通过多个代码示例,帮助读者理解闭包的工作原理和作用域链的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.闭包是什么?

理解:个人理解为在一个函数中去使用其他一个或者多个函数内部的变量

定义:闭包是指一个函数能够访问并操作其外部作用域的变量的能力。

           一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数

作用:读取他函数内部的变量以及保存这些变量(不让其销毁,但可能带来了内存泄漏问题)

2.理解下javascript变量的作用域:

简单划分为全局作用域(global document),函数作用域(可以理解局部作用域,自己定义的一些函数内部的变量)

函数内部可以使用全局变量(注意:函数内部变量的声明必须使用var,否则系统默认为全局变量),而函数外部是不可以调用函数内部变量的,这就是作用域链。

同时闭包的返回值一定是全局的,否则无法保存下来。如果想用this,需要that=this搞过来一下。

3.代码跑起来:

var a=1;
  function f(){
    alert(a);
  }
  f(); // 1   这段代码说明函数内部可以使用全局变量的

4.代码跑起来:

function f(){
    var a=1;
}
alert(a); // error

这段代码说明函数外部无法使用函数内部的局部变量

5.如何在函数外部正确使用函数内部变量 ???

简单的方法就是在内部函数外层再定义一层函数,并将内层函数return出去!

6.代码跑起来:

 function f1(){

    var a=1;

    function f2(){
      alert(a); 
    }

    return f2;

  }

  var r=f1();//此时函数值发生变化指向了f2

  r(); // 1

7.代码跑起来:

function f1(){
    var n=1;
    add=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }
  var r=f1();
  r(); // 1
  add();
  r(); // 2
可以理解为r现在指向为f2函数,并且他执行了两次!其中add是运算加和!

8.代码跑起来:


function f1(){
   var n=1;
   add=function(){
         n+=1 ;
         alert(n)
   }
    return add;
    function f2(){
         alert(n);
    }
    return f2;
}
var r=f1();
r()//2
r();//3
解释器解释js 从上到下 ,return结束执行
此时因为return了add,下面不在执行!

9.代码跑起来:

function f1(){
    var n=1;
    add=function(){
           n+=1 ;
           alert(n)
       }
    function f2(){
      alert(n);
    }
    return f2;
  }
  var r=f1();
    r()1
     add();2
      r();2

为什么是两个2
不要奇怪因为有一个是add中alert()输出2!

10.代码跑起来:

function f1(){
    var n=1;
    add=function(){
          n+=1 ;
       }
    function f2(){
      alert(n);
    }
    return f2;
  }
  var r=f1();
   r() //1
     add() //只让他做运算
     r(); //2

删除add中alert(),这次只有一个2输出

11.代码跑起来:

var name = "Window";
  var obj = {
    name : "My",
    getName : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(obj.getName()()); //windows

此时return回来的函数已经不再是obj的属性,返回的是一个为执行的函数表达式,
所以这是this指向全局函数(window)
不相信的的小朋友可以 alert 一下obj.getNAme()函数。
里面一定是function(){return this.name;};

12.代码跑起来:

var name = "Window";
  var object = {
    name : "My",
    getName : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
  alert(obj.getName()());//my
此时改变了this指向 输出my

内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循五大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值