JavaScript红宝书第3章:var let以及const的区别和作用

简介: var let以及const的区别和作用

ES5:var


ES6:let、const


var怪异变量


首先我们要明确,var是一个块变量也叫作用域变量,如果它放到一个函数中,在函数外调用应该是失败的,在不用var a=1,这样进行定义而变成a=2,时则这个变量就变成了全局变量,如


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <script>
      function var1() {
        var a = 3
      }
      function var2() {
        b = 4
      }
      var1()
      var2()
      console.log(b)
      console.log(a)
    </script>
  </body>
</html>




在上述代码中,正常定义的a是报错显示a没有被定义,但是没有定义的b=4则怪异的变成了全局变量,一方面我们可以使用严格模式来定义这个函数,则会解决这个怪异问题。‘use strict’




同时它还有变量提升的怪异之处,我们知道,在script当中是按顺序来进行初次加载和调用的,如果我们在script全局作用域中打印出来一个a变量,那我们一定要先定义a变量再打印才能出现结果,否则就会报错,但在怪异变量中,我们如果先打印后定义不会报错,会显示undefined,就是变量已经被定义但是没有被赋值,是因为在ES当中


console.log(a);var a=1;


被等价成


var a;console.log(a);a=1;



也就是把所有的变量都拉到当前作用域的顶部,此外,多次使用var声明同一个变量也没有问题。


这就是var变量的怪异之处。而正是因为这些怪异之处,导致在ES6当中,诞生了let和const两个关键词。



let关键词


let和var的区别是,它没有var那些怪异的‘处事风格’,同时它是一个块作用域,而var是一个函数作用域


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <script>
      function let1() {
        if (true) {
          let a=1;
        }
        console.log(a)
      }
      function var1(){
        if(true){
          var a=1;
        }
        console.log(a)
      }
      var1();let1()
    </script>
  </body>
</html>



具体表现为,它在if-else,switch,for等定义的变量,在这些条件语句外则无法被调用,每个条件语句对它来说都是一个块,而var,只要在函数中任何地方定义,就可以在任何地方被调用。


同时在let中,也不会变量提升,在定义let变量前,不能被调用,也称为“暂时性死区”。


全局声明


在全局作用域中声明的let变量不会成为window对象的属性,而var定义的变量会,具体表现在,window.属性名出现具体值还是出现的是undefined。



<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <script>
      var a=1;
      console.log(window.a)
      let b=1;
      console.log(window.b)
    </script>
  </body>
</html>




const常量


const在初始化时必须被赋初值且不能被修改,但如果定义的是对象,修改对象中的属性的具体值,则不会报错且能修改。因为const声明的限制只是在它指向变量的引用。而具体的属性的值在修改的时候,并没有改变属性变量所在地址,所以这种改变是被允许的,但是不能改变它的属性名。





上述例子中,我们发现当我们在const常量对象中修改属性的内容可以被修改,如果利用正则表达式修改某个属性名,则不会被修改成功。如果把const变成let则可以修改成功。

在大多数时候,为了避免出现代码怪异的情况,大多数开发者会选择用let和const来代替var关键词作为定义变量的主要选择,同时这样也会提升代码质量,让代码不会出现重复定义的问题和全局/作用域问题。实际const,let,var的这些属性和特征往底层实现还是要看基础的存储空间堆栈那里,这里就不多赘述了。

相关文章
|
5天前
|
JavaScript 前端开发
autox.js中if和while的用法区别和差异
autox.js中if和while的用法区别和差异
|
9天前
|
JavaScript API 索引
JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)
JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)
28 0
|
9天前
|
JSON JavaScript API
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
15 0
|
10天前
|
JavaScript
Js,定义数组的方法,let 数组名 = [数据1,数据2,........,数据n],取值方法,数组名[x],arr[0],let sum sum = sum + arr[0],求和的写法,平均值
Js,定义数组的方法,let 数组名 = [数据1,数据2,........,数据n],取值方法,数组名[x],arr[0],let sum sum = sum + arr[0],求和的写法,平均值
|
12天前
|
JavaScript 前端开发
|
13天前
|
JavaScript 前端开发 数据格式
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
15 0
|
JavaScript 前端开发
javascript 全局变量 局部变量 var 与不加var的区别
一、外部的为全局,内部的为局部变量。   二、加var为局部变量(在方法内),不加var为全局变量(当方法内有一次使用后) var golbe="global"; test(); function test(){ var local="local"; document.
829 0
|
6天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
19 2
|
6天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
14 4
|
6天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
17 4