当前位置: 首页 > news >正文

const let

前世

在 const & let 还未出现前,JS 的世界一直是 var的统治

var:在JS中用于变量声明的关键字。

特点:

  1. 变量提升
  2. 只有函数作用域或者全局作用域,没有块级作用域
  3. 重复声明变量
  4. 循环体重的闭包会出现问题

    …….

变量提升

function test(tag) {
    console.log(a,b);   // a,b在下面声明,但是会打印出undefined,不会报错
    
    if(10 >= tag) {
        var a = tag + 1;
    } else {
        var b = tag - 1;
    }
}

在浏览器预解析机制中,加载函数的时候,此时的作用域为函数作用域,函数作用域中JS会先将所有的声明置顶。

function test(tag) {
    var a,b;            // 将声明置顶,但是赋值并不会
    console.log(a,b);   // a,b在下面声明,但是会打印出undefined,不会报错
    
    if(10 >= tag) {
        var a = tag + 1;
    } else {
        var b = tag - 1;
    }
}

只有函数作用域以及全局作用域,没有块级作用域

function test(tag) {
    console.log(a,b);   // a,b在下面声明,但是会打印出undefined,不会报错
    
    if(10 >= tag) {
        var a = tag + 1;
    } else {
        var b = tag - 1;
    }
    
    console.log(a);        // 9
}

test(8)  // 9

按照其他语言规则 if 是一个程序块,在 if 中声明的变量作用域只能在 if 中,但是 JS 因为只有函数作用域和全局作用域,所以才会导致在 if 判断外还可以访问 if 的变量

重复声明变量

var a = 1;
var a = 2;

console.log(a); // 2

在使用var的时候允许重复声明变量也是令人头痛的事情,也许因为这个机制,可能就会出现bug

循环体重的闭包会出现问题

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

for(var j = 0; j < 3; j++) {
    console.log(arr[j]());    // 3,3,3
}

将var -> let
将会打印出 0,1,2

因为缺乏块作用域所以导致问题出现

今生

如今距离ES6规范的出现已经过去了4年多了,在项目中也早已开始大量使用ES6规范编写代码了。var也不再是JS世界的唯一了,

JS 世界出现了const & let。

const & let 的出现给JS带来了块级作用域,解决了变量提升,禁止了重复声明变量,让JS少了很多疑惑的地方。

let & const

相同点:

  1. 具有块级作用域
  2. 禁止重复声明变量
  3. 不会产生变量提升

区别:

let

使用let声明的基本类型变量是可以改变值

let a = 12;
a = 13;
return a;    // 13

使用let声明引用类型的变量是可以改变引用的

let info = {
    name: "ming995",
    age: 25,
    sayHi: function() {
        console.log(`Hi I'm ${this.name}`)
    }
};

let heInfo = {};

heInfo = info;

heInfo.name = "Jack";

console.log(heInfo);

const

使用const声明的基本类型变量是不可以改变值

const a = 13;
a = 14;
return a; // 报错

使用const声明引用类型的变量是不可以改变引用的

const info = {
    name: "ming995",
    age: 25,
    sayHi: function() {
        console.log(`Hi I'm ${this.name}`)
    }
};

const heInfo = {};

heInfo = info;        // 报错
    
heInfo.name = "Jack";

console.log(heInfo);

但是我们可以操作const声明的引用类型的属性值

const info = {
    name: "ming995",
    age: 25,
    sayHi: function() {
        console.log(`Hi I'm ${this.name}`)
    }
};

info.language = "js";

console.log(info);

总结

之前对于const的理解有偏差,所以就写这篇文章。var时代已经过去了,ES6各种特性用起来。

相关文章:

  • 冷启动问题:如何构建你的机器学习组合?
  • hive报错 Another instance of Derby may have already booted the database
  • iOS应用审核的通关秘籍【转】
  • QTP常用功能
  • TCP三次握手
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • Windows和Linux环境下Memcached安装与配置(转)
  • 如何给wordpress首页自动显示文章内容的第一个图片
  • Azure Automation (3) 定期将某个Azure订阅下的所有虚拟机开关机
  • haslayout
  • python练习程序(批量重命名)
  • 国标电表DLT645转MODBUS TCP协议转换器MRD-5021,工业设备,浪涌三级保护MRD
  • jquery 绑定省份和城市
  • 《高性能mysql》到手
  • hdu--1811--并查集拓扑排序好题
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • HTTP 简介
  • java中的hashCode
  • Logstash 参考指南(目录)
  • markdown编辑器简评
  • MYSQL 的 IF 函数
  • Otto开发初探——微服务依赖管理新利器
  • SpriteKit 技巧之添加背景图片
  • ucore操作系统实验笔记 - 重新理解中断
  • 简单实现一个textarea自适应高度
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 巧用 TypeScript (一)
  • 三栏布局总结
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 积累各种好的链接
  • #git 撤消对文件的更改
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $.ajax中的eval及dataType
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (07)Hive——窗口函数详解
  • (function(){})()的分步解析
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (一)SpringBoot3---尚硅谷总结
  • (正则)提取页面里的img标签
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net 知识杂记
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET微信公众号开发-2.0创建自定义菜单
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示