前言

ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const。

  • let 声明的变量只在 let 命令所在的代码块内有效。
  • const 声明一个只读的常量,一旦声明,常量的值就不能改变。

在 ES6 之前,JavaScript 使用var声明变量只有两种作用域: 全局变量 与 函数内的局部变量。

var声明变量使用

var声明变量只有两种作用域: 全局变量 与 函数内的局部变量。

全局变量

在函数外声明的变量作用域是全局的, 在任意地方都可以引用

    var x = 'hello';function fun1() {// 函数内部也可以引用xconsole.log(x)}fun1();

局部变量

在函数内部定义的var 变量只能局部使用,函数外面都无法引用。

    function fun1() {var x = 'hello';// 函数内部可以引用xconsole.log(x)}// 函数外面不能引用函数内部变量xconsole.log(x)  //  x is not definedfun1();

没有块级作用域

使用var定义的变量,没有块级作用域,什么是块级?比如if 后面大括号的内容,for 循环大括号里面的循环体,都是块级。

    a = 10;if (a > 0){var x = 'hello'}// if 块级外面也能引用xconsole.log(x)

for 循环体也是块级

    arr = [1, 2, 3];for(var index in arr){var x = 'world'}// for 外面也能引用xconsole.log(x);   // world// for 外面也能引用indexconsole.log(index);  // 2

没有块级作用域,那在使用过程中就会出现一些问题,比如重新声明同一个名称变量

    var a = 'hello'var x = 20;if (x > 0) {var a = 'world';}// 在if 中声明了同一个a, 最后会影响外面的a值console.log(a);  // world

为了避免这种问题,所以在新的ES6 中添加了let 关键字声明变量

let 声明变量作用域

块级作用域

使用let声明的变量,首先具有块级作用域的概念,在块级代码声明的变量,外面无法引用

    a = 10;if (a>0){let x = 'hello';  // let 声明块级变量console.log(x);}console.log(x);   // x is not defined

如果块级代码外面也有同一个名称变量,使用let互不影响

    a = 10;let x = 'world'if (a>0){let x = 'hello';  // let 声明块级变量console.log(x); // hello}console.log(x);   // world

在for循环时使用let定义循环变量i

    let i = 5;for (let i = 0; i < 10; i++) {// do something...}console.log(i)  // 这里输出 i 为 5

局部变量

在函数体内使用 var 和 let 关键字声明的变量有点类似, 作用域都是局部的:

function fun() {let x = "hello";   //  局部作用域return x}

全局变量

在函数体外或代码块外使用 var 和 let 关键字声明的变量也类似,它们的作用域都是全局的

// 使用 var
var x = 'hello';       // 全局作用域// 使用 let
let y = 'hello';       // 全局作用域

let 和 var 不一样的地方

重复声明

var 可以对同一个变量重复声明,但是let不能重复声明

// 使用 var
var x = 'hello';
var x = 'world';
console.log(x);   // world

使用let重复声明同一个let声明过的变量会报错,相同的作用域或块级作用域中都不行。

// 使用let
let y = 'world';
let y = 'world'; // 报错

会抛出异常Uncaught SyntaxError: Identifier 'y' has already been declared (at ...)

也不能使用 let 重复声明 war 声明过的变量,相同的作用域或块级作用域中都不行。

var y = 'world';
let y = 'world'; // 报错

或者以下也不行

let y = 'world';
var y = 'world'; // 报错

变量提升

let 声明的变量没有提升

console.log(x)  // undefined
var x = 'hello'console.log(y)  // 报错
let y = 'world';

全局作用域

使用 var 关键字声明的全局作用域变量属于 window 对象:

var x = "hello";
// 可以使用 window.x 访问变量

使用 let 关键字声明的全局作用域变量不属于 window 对象:

let y= "world";
// 不能使用 window.y访问变量

总的来说let声明的变量多了一个块级作用域的使用,在使用的时候尽量避免声明同一个变量。

JavaScript 学习-9.使用let声明变量相关推荐

  1. JavaScript学习笔记(6)变量

    什么是变量,通俗来说就是存储东西的容器. 本质是程序在内存中申请的一块用来存放数据的空间.变量名存放的是存储空间的地址,我们通过变量名来找到这一块空间. 如何使用变量 变量的使用分为两步:1.声明变量 ...

  2. JavaScript学习笔记——JS中的变量复制、参数传递和作用域链

    今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...

  3. Javascript学习笔记(三)--变量、作用域和内存问题

    一.变量 1.基本类型和引用类型的值 变量包含两种不同类型的值:基本类型值和引用类型值. 基本类型值包括:Undefined.Null.Boolean.Number和String(String在js属 ...

  4. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

    JavaScript:学习笔记(7)--VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...

  5. [Javascript学习笔记]JS变量不声明也能使用,直接天下无敌!

    认识变量 什么是变量 变量 变量的输入与输出 同时声明多个变量 声明变量特殊情况 变量命名规范 什么是变量 本质:变量是程序在内存中申请的一块用来存放数据的空间. 变量 变量的输入与输出 <!D ...

  6. JavaScript学习笔记 - 变量、作用域与内存问题

    本文记录了我在学习前端上的笔记,方便以后的复习和巩固. 4.1基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型指的是简单的数据段,而引用类 ...

  7. JavaScript学习(八十四)—变量

    JavaScript学习(八十四)-变量 一.什么是变量? 白话: 变量就是一个装东西的盒子 通俗:变量是用于存放数据的容器. 我们通过 变量名 获取数据,甚至数据可以修改. 二.变量在内存中的存储 ...

  8. 【Javascript】javascript学习 六 七 JavaScript 变量/运算符

    变量是用于存储信息的容器: x=5; length=66.10; 还记得在学校里学过的代数吗? 当您回忆在学校学过的代数课程时,想到的很可能是:x=5, y=6, z=x+y 等等. 还记得吗,一个字 ...

  9. JavaScript声明变量详解

    前言 如果文章中有出现纰漏.错误之处,还请看到的小伙伴多多指教,先行谢过 在ES5阶段,JavaScript 使用 var 和 function 来声明变量, ES6 中又添加了let.const.i ...

最新文章

  1. 扩增子统计绘图3热图:样品相关分析,差异OTU/ASV
  2. 关于.framework 文件过大 移除包内对i386 x86_64 的支持
  3. Increasing or Decreasing 序列 转换
  4. 基于STM32,无人船岸基信息处理代码--python实现
  5. Unreal Engine 4 —— 多线程任务构建
  6. logback 配置详解
  7. python转义例题_笨办法学Python记录--习题37 异常,lambda,yield,转义序列
  8. 单源最短路径的Bellman-Ford算法。
  9. 【数字信号】基于matlab GUI可编程电音合成器【含Matlab源码 872期】
  10. 将dataset中的数据 数据库中 java_java-将NoSQLUnit与@ShouldMatchDataSet一起使用时,...
  11. 威纶触摸屏宏指令编程,字符串相关函数介绍与使用...
  12. msm8937+android7.1.1显示驱动解决显示残影问题
  13. 历史时点数据统计如何设计表结构_如何做好调薪管理?年度调薪的操作方式
  14. scalac: Token not found...
  15. java实现多张图片同时上传
  16. 图片去雾软件推荐,这些软件值得一试
  17. day.js插件处理日期
  18. EAUML日拱一卒-微信小程序实战:位置闹铃 (5)-显示所在位置的信息
  19. PHP反弹shell
  20. chapter04_聪明的表设计

热门文章

  1. 用python写一个3D走马灯
  2. 高通骁龙835:手机充电5分钟续航5小时
  3. 使用极域电子教室远程批量处理
  4. 基于PLC控制的导热油温控系统如何实现远程监控
  5. linux shell 鼠标事件,Bash Shellshock事件:CVE-2014-6271资料汇总
  6. pycharm安装到32位操作系统
  7. 编写一个方法参数接收一个字符串,返回一个Date对象(在多种日期格式中找到与字符串匹配的那一个)用到解析异常ParseException
  8. 极路由2设备认证信息与服务器不符,极路由HC5761A救砖日志2
  9. 【统计学习方法】学习笔记——EM算法及其推广
  10. AtCoder Beginner Contest 187 F - Close Group