首页 > 其他分享 >let和var特性去了解闭包问题的特性

let和var特性去了解闭包问题的特性

时间:2023-09-25 22:59:02浏览次数:22  
标签:闭包 函数 作用域 特性 let var setTimeout

下列代码输出结果为?

for(var i = 0; i < 3; i++){

setTimeout(function(){

console.log(i); },0);

};

输出结果是:3,3,3

为什么不是0,1,2呢?

如果换成

for (var i = 0; i < 3; i++) { (function(i) {

setTimeout(function () {

console.log(i); }, 0, i)

})(i) };

就可以输出012

主要原因是setTimeout是异步函数,所以他会在最后再去获取i,var和let的特性不同,var是函数作用域,而let是块级作用域,使用 var 声明 i 时,i 具有函数作用域,而且它是在全局范围内声明的。

因此,在循环结束后,i 的值变成了 3。而用let去声明变量的时候,每次迭代的时候都会去创建一个新的变量i去存储,所以能够输出012。

使用var去定义,是一个典型的闭包问题,让我解释一下为什么这是闭包:

  1. for 循环中,你使用了 var 声明了变量 i,这将使 i 具有函数作用域。

  2. setTimeout 的回调函数内部,它引用了变量 i。即使 setTimeout 是异步执行的,它仍然可以访问和引用 for 循环中的 i 变量。

  3. setTimeout 的回调函数执行时,它访问的是外部函数作用域中的 i 变量,而不是在函数内部声明的 i

这也侧面反应了闭包问题的特性就是,优点是能够更新新的数据,

但是缺点是,不利于去存储迭代的数据。且内存消耗:由于闭包保留了对外部作用域的引用,它们可能导致内存泄漏问题,特别是当闭包的生命周期比外部函数长时。

 

标签:闭包,函数,作用域,特性,let,var,setTimeout
From: https://www.cnblogs.com/Ly021/p/17729051.html

相关文章

  • spring5.0新特性学习
    核心容器修订:函数式编程方式注册bean;对GraalVMNativeImage的支持(可以通过运行原生代码的方式提高速度,原理是剔除了一些不需要的编译path来提高速度)对JavaRecord类模型的支持(JDK14引入的类,可以直接在数据绑定的时候,对Javabean中的变量可以省略get直接用变量名作为方法名来使用......
  • java有哪三大特性?
    文章目录⭐专栏介绍问题描述问题答案⭐专栏介绍本专栏会持续更新各种关于JAVA的问题,包括面试题,JAVA入门到精通等。更新速度保持在每天3—5篇问题描述java有哪三大特性?问题答案1、JAVA有三大特性,分别是:封装、继承和多态。2、封装:面向对象的封装就是把描述一个对象的属性和行为的......
  • 【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分
    文章目录一、基础数据类型数组内存分析1、malloc分配内存delete释放内存2、new分配内存free释放内存二、类对象内存分析1、malloc分配内存delete释放内存2、new分配内存free释放内存博客总结:C语言中使用malloc分配的内存,使用free进行释放;C++语言中......
  • Rust函数与闭包
    1.常规函数函数都拥有显示的类型签名,其本身也是一种类型。1.1函数类型自由函数//自由函数fnsum(a:i32,b:i32)->i32{a+b}fnmain(){assert_eq!(3,sum(1,2))}关联函数与方法structA(i32,i32);implA{//关联函数fnsum(a:i32,b:......
  • JDK10优化了哪些功能以及新增了哪些特性功能|JDK各个版本的特性分析
    一、前言上一期讲了JDK9的一些新特性,需要回顾的朋友们可以看下这篇文章《JDK9优化了哪些功能以及新增了哪些特性功能》这一期讲一讲JDK10的一些新功能二、新增特性以下是JDK10的一些新增或变化的特性:1.局部变量类型推断(LocalVariableTypeInference):引入了var关键字,允许在局部变......
  • JDK9优化了哪些功能以及新增了哪些特性功能|JDK各个版本的特性分析
    一、前言我们现在大部分公司都在使用jdk8,jdk8的功能主要是增加了lambda流式处理,还有优化了线程安全的时间LocalDate,这里我就先不赘述了,那jdk9相对jdk8优化了哪些功能,以及新增了哪些特性功能呢,下面一一给大家讲述一下二、新增特性以下是一些主要的变化和新增特性:1.模块化系统(Jig......
  • Java SE 21 新增特性
    JavaSE21新增特性作者:Grey原文地址:博客园:JavaSE21新增特性CSDN:JavaSE21新增特性源码源仓库:Github:java_new_features镜像仓库:GitCode:java_new_featuresRecordPatterns该功能首次在JavaSE19中预览,在JavaSE20中发布第二次预览版,在此版本中成为永久性功......
  • python面向对象的三大特性:封装性、继承性、多态性
    python面向对象的三大特性:封装性、继承性、多态性一、python中的封装在python代码中,封装具有两层含义:①在把现实世界中的实体中的属性和方法写到类的里面的操作即为封装。classPerson(object):#封装属性#封装方法②封装可以为属性和方法添加私有权限(属性和方......
  • PostgreSQL教程:事务的ACID特性及基本使用
    什么是ACID?在日常操作中,对于一组相关操作,通常要求要么都成功,要么都失败。在关系型数据库中,称这一组操作为事务。为了保证整体事务的安全性,有ACID这一说:原子性A:事务是一个最小的执行单位,一次事务中的操作要么都成功,要么都失败。一致性C:在事务完成时,所有数据必须保持在一致的状态。(事......
  • Java 21 正式发布!新特性专栏继续更起来了~
    就在昨天晚间,Oracle公司宣布Java21正式发布。该版本是继JDK17之后最新的长期支持版本(LTS),将获得至少8年的支持!Java21号称具有数千项性能、稳定性和安全性改进。新的JDK21包括对15项改进的抢先体验,这些增强功能是在OracleCloudWorld2023会议上宣布的,包括支持虚拟线程以......