let关键字

news/2024/7/19 16:12:24 标签: js, javascript, es6

基本语法

var关键字用法基本一致。

javascript">    let a = 10;

    let fn = function () {
        console.log('hello')
    }

    fn();
    console.log(a);

var的区别

  • var关键字会将变量挂载到window对象上,无块级作用域,有变量提升。
  • let关键字不会将变量挂载到window对象上,有独立的块级作用域,无变量提升。
  • let具有暂时性死区的特性。

举例说明:

javascript">    for (var i = 0; i < 5; i++) {
        console.log(i);
    }

    alert(i);//5

不会报错。

javascript">    for (let i = 0; i < 5; i++) {
        console.log(i);
    }

    alert(i);//i is not defined

报错了。循环变量i在结束循环后,理应被立即销毁,但是使用var关键字声明的i却会一直存在,不符合我们的期望。推荐使用let定义循环变量。

javascript">    if (true) {
        var num = 10;
    }

    console.log(num);//10

var定义在if语句中的局部变量,在外部也能访问到,这在大部分情况下不是我们期望的。推荐使用let定义局部变量。

再看一下这段代码:

javascript">    var arr = [];

    for (var i = 0; i < 3; i++) {
        arr[i] = function () {
            console.log(i);
        }
    }

    arr[0]();//3
    arr[1]();//3
    arr[2]();//3

这段代码中,每次循环都会给数组返回一个函数,这个函数会输出i。但是,它们不会如我们所愿,输出对应的索引值,它们都会输出循环结束后的i的值,即为3。

因为,数组中的3个函数中用到的i变量均为一个,那就是这个循环变量i的引用,循环并没有为它们3个单独创建3个i变量。

javascript">    var arr = [];

    for (let i = 0; i < 3; i++) {
        arr[i] = function () {
            console.log(i);
        }
    }

    arr[0]();//0
    arr[1]();//1
    arr[2]();//2

但是如果使let循环变量,结果则截然不同。这三个函数会如愿输出索引值。

因为let关键字有独立的块级作用域,循环会为三个函数分别创建三个i的副本。

暂时性死区

javascript">    var num = 3;

    if (true) {
        console.log(num);//报错,未定义
        let num = 20;
    }

在局部作用域中,如果使用let定义变量,那么这个变量不会受同名全局变量的影响。也就是说,上面代码中,执行到console.log(num)时,会先找if局部作用域的num,找不到的情况下会查找全局作用域,但是这个局部作用域用let定义了一个num,则在找不到num时,不会查找全局作用域,故报错。

总结

let的出现,使得JS语言变得更加严谨,安全,合理。


http://www.niftyadmin.cn/n/1257985.html

相关文章

你不知道的if,else

alert&#xff1a; 输出 prompt&#xff1a; 框 confirm&#xff1a; 返回上一级 顺序语句&#xff1a; 从上往下顺着写 分支语句&#xff1a; if else if 循环语句&#xff1a;for循环 while循环 <script type"texe/javascript> if(判断条件) {…

thinkphp-内置标签

判断比较 if                                   <if condition"$name eq 1">                  $this->assign(name,1); 1 <elseif condition"$data.name eq 2" />        …

一个简单的网站(适合课设)

前言 这是我帮同学写的一个很简单的网站&#xff0c;没有后端&#xff0c;主要的技术有jQuery&#xff08;包括Ajax&#xff09;&#xff0c;模仿的是h2j的天猫仿站项目。 可以用于web课设&#xff0c;或者其他前后端交互的界面。下面看下预览图。 由于时间紧&#xff0c;没做…

IIS发布MVC ASP.NET网站

发布网站后&#xff0c;发现无法访问,最后在配置文件上添加一段&#xff1a; <system.codedom> <compilers> <compiler language"c#;cs;csharp" extension".cs" type"Microsoft.CSharp.CSharpCodeProvider,System, Version2.0.0.0, Cu…

js创建模式

工厂模式 function createPerson(name, age, job) {var o new Object();o.name name;o.age age;o.job job;o.sayName function () {alert(this.name);}return o;}var p1 createPerson(zed, 18, Doctor);var p2 createPerson(ls, 19, Engineer);p1.sayName()p2.sayName()…

Codeforces Round #409 (Div. 2) D Volatile Kite

题意:给一个凸多边形(顺时针方向)&#xff0c;对每个点任意移动距离D&#xff0c;求最大的D使得这个多边形一直是凸多边形。 思路&#xff1a;容易发现对于凸多边形相邻的三个点。。pi&#xff0c;pi1,pi2。。pi1到直线pi,pi2的距离除以2就是这组点所能接受的最大值。这n组点的…

【计算机】基本概念的理解 —— 沙盒(sandbox)、交互式计算/编程/应用

web scraper&#xff1a;网络铲&#xff1b; scraper&#xff1a;n. 刮刀&#xff1b;铲土机&#xff1b;守财奴&#xff1b;1. 交互式计算/编程/应用&#xff08;interactive computing/application/programming&#xff09; 交互式计算&#xff08;有时也叫交互式应用&#x…

springboot+thymeleaf 东软医疗项目 开发错误记录

学校的一个实训要求用springboot 开发&#xff0c;作为第一次接触该框架的前端人儿来说&#xff0c;是个挑战。 也做了半个月了&#xff0c;项目还有一半大概。笔者决定再此记录开发中遇到的错误&#xff0c;同大伙分享的同时&#xff0c;也告诫自己不要再犯。 后端我之前用no…