var 重新赋值,重新定义,作用域 属于:function scope;

let 声明的变量只在 let 命令所在的代码块内有效,Block scope。

const 声明一个只读的常量,一旦声明,常量的值就不能改变。

 

传送门:https://www.runoob.com/w3cnote/es6-let-const.html

对比一:作用域:var:function scope,所以以下代码,var totalPrice 为全局;let,const为块级作用域,只作用在if条件范围内;

var price = 10;
var count = 10;
if (count > 5) {
var totalPrice = 10 * 0.9;
console.log(`var totalPrice:${totalPrice}`);
}
console.log(totalPrice);//成功输出9 这里的totalPrice是全局变量,可以访问

  

var price = 10;
var count = 10;
if (count > 5) {
let totalPrice = 10 * 0.9;
console.log(`let totalPrice:${totalPrice}`);
}
console.log(totalPrice);//会出错误(Uncaught ReferenceError: totalPrice is not defined) 这里的totalPrice是let块级变量,外部无法访问

对比二:作用域:以下代码只有声明的类型不一样,var 支持重新赋值,totalPrice会被重新赋值,而let中的totalPrice,第一个为全局变量, 第二个只被作用在块级中,所以最终输出0

        var price = 10;
var count = 10;
var totalPrice = 0;
if (count > 5) {
var totalPrice = 10 * 0.9;
console.log(`var totalPrice:${totalPrice}`); //9
}
console.log(totalPrice); //9

  

        var price = 10;
var count = 10;
let totalPrice = 0;
if (count > 5) {
let totalPrice = 10 * 0.9;
console.log(`let totalPrice:${totalPrice}`); //9
}
console.log(totalPrice); //0

  

对比三:var,let,const:定义,赋值,区别如下,注意const为对象时,虽然不能被重新赋值,但是可以修改其属性值

        var name = "sun";
var name = "sun2"; //可以被重新定义
name = "liping"; //可以被重新赋值
console.log(`var name:${name}`); //var name:liping let age = 10;
//let age = 20; //会出错,不能被重新定义
age = 22; //可以被重新赋值
console.log(`let age:${age}`);//let age:22 const sex = "女";
//const sex = "男"; //会出错,不能被重新定义
//sex = "男"; //会出错,不能被重新赋值
console.log(`const sex:${sex}`); //女

  

第四点:控制属性的改变:

      const product = {
name :"手机",
price:5999
}; //可以修改属性
product.price = 8999; console.log(JSON.stringify(product));//{"name":"手机","price":8999} //如果不想product被改变则:(使用freeze方法冻结该对象)
const product2 = Object.freeze( {
name :"手机",
price:5999
});
product2.price = 9999; console.log(JSON.stringify(product2));//{"name":"手机","price":5999}

  

第五点:实际应用过程的细节

    for (var i = 0; i < 5; i++) {
console.log(`var i is ${i}`); //这里会输出 0,1,2,3,4 setTimeout(function () {
console.log(`var i is ${i}`); //这里会输出 5个 5 }, 1000);
} console.log(`i is ${i}`); //会输出5 console.log(`---------------解决setTimeout输出0-4的数字------------------------------`); for (let i = 0; i < 5; i++) {
console.log(`let i is ${i}`); //这里会输出 0,1,2,3,4 setTimeout(function () {
console.log(`let i is ${i}`); //这里会输出 0,1,2,3,4 }, 1000);
}

  

第六点:同理解析:当执行a[1]方法时,i 已经=3了,所以都输出3,如果想要输出1,2,3可改类型为let

        var a = [];
for (var i = 0; i < 3; i++) {
a[i] = function () { console.log(i) }
}
a[1](); //3
a[2](); //3

第七点:当块级元素

       var a = 10;
if (1) {
a = 100; //当块级元素包含let声明,给a赋值,只在当前块找a
console.log(a);//所以这里会报错
let a = 1;
console.log(a);
}

  

第八点:变量提升:

        console.log(abc);//undefined  ,变量提升,实际解析:var abc; console.log(abc);abc=10;
var abc = 10; //console(num);//会出错
let num = 10; //console.log(filename);//会出错
const filename = "abc.txt";

  

写在最后:以上只是说明用法,随手百度就能了解,原理后续再作研究

简单了解一下:var 、let、const的更多相关文章

  1. let、var、const区别(表格比较)

    let.var.const区别(表格比较): 区别项 let var const 作用域 块级作用域 全局作用域或函数作用域 块级作用域 是否有变量提升 无 有 无 是否可重复声明 不可 可以 不可 ...

  2. let、var、const声明的区别

    前言 看了方应杭老师的一篇解释let的文章,对JavaScript中的声明有了深刻的理解,这里也就有了总结一下JavaScript中各种声明之间区别的这篇文章. JavaScript中变量声明机制 首 ...

  3. var let const 的区别

    Var let const 的区别 1.Var 定义的变量存在变量提升,而了let和const不存在变量提升.即在定义的变量代码上使用该变量,var的会输出undefined,而let的会报错. 2. ...

  4. ES6和ES5变量声明的区别(var let const)

    // es5的语法与es6的语法区别 // var let const console.log(name);//undefine,不会报错,因为变量声明会提到作用域的最前面 var name=&quo ...

  5. var和const和let的区别

    简述: 1.前端的变量申明,可以用到var,ES6的const(衡量)/let(变量) 2.在ES5用的都是var,到ES6之后,也就是2015年开始出现const/let. var 不会报错,有声明 ...

  6. var let const的一些区别

    var let const 都是来定义变量的. var let 作用域有些区别. const 类似于java中的常量的概念.即:只能给一个变量赋值一次,即指定一个引用. 举例来说: function ...

  7. javascript中var let const三种变量声明方式

    javascript中var let const三种变量声明方式 1.var  ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...

  8. es6(var,let,const,set,map,Array.from())

    1.变量声明--var,const,let 1.1 var - (全局作用域,局部作用域)会有变量提升 //第一个小例子 <script> var num = 123; function ...

  9. let、var、const用法区别

    1.var var 声明的变量为全局变量,并会进行变量提升:也可以只声明变量而不进行赋值,输出为undefined,以下写法都是合法的. var a var a = 123  2.let let 声明 ...

  10. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

随机推荐

  1. 一个缓存使用案例:Spring Cache VS Caffeine 原生 API

    最近在学习本地缓存发现,在 Spring 技术栈的开发中,既可以使用 Spring Cache 的注解形式操作缓存,也可用各种缓存方案的原生 API.那么是否 Spring 官方提供的就是最合适的方案 ...

  2. 关于Python的随机数模块,你必须要掌握!

    所谓七夕 前几天的文章这个七夕节,用Python为女友绘制一张爱心照片墙吧!收获了最近以来最高的浏览量,没枉费我熬到夜里3点赶出来的热点文章.有付出就总会有所回报,只是看这天来的早晚而已.七夕一个人看 ...

  3. .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换

    1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...

  4. Python中 * 与 **, *args 与 **kwargs的用法

    * 用于传递位置参数(positional argument) ** 用于传递关键字参数(keyword argument) 首先,先通过一个简单的例子来介绍 * 的用法: def add_funct ...

  5. iOS 网络基本剖析

    一.网络通信的本质 数据传输,数据交换 Client     <======>  服务器 二.HTTP.TCP,IP.UDP.Socket关系刨析 Socket:套接字,是一个用于网络传输 ...

  6. EditText 无法失焦与失焦后键盘不收缩解决方案

    背景 有一个需求,比方说下图: 点击了上图的Image 区域才可以编辑. 那么我首先想到的就是: android:focusable="false" 不让它获取到焦点不就ok吗? ...

  7. ZOJ 2112 Dynamic Rankings(树状数组+主席树)

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

  8. CF 1132A,1132B,1132C,1132D,1132E,1132F(Round 61 A,B,C,D,E,F)题解

    A.Regular bracket sequence A string is called bracket sequence if it does not contain any characters ...

  9. BZOJ 3265 志愿者招募加强版(单纯形)

    3265: 志愿者招募加强版 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 848  Solved: 436[Submit][Status][Disc ...

  10. 洛谷 题解 P5015 【标题统计】 NOIP2018 普及组 T1

    没有人用 scanf("%c", &ch) != EOF 吗? scanf 和 EOF 会伤心的. 思路:逐个读入字符,遇到EOF中止,对于每个读入的字符进行判断. 附上考 ...