这几天修改别人的js,发现声明变量有的用var,有的用let,那它们有什么区别呢?

javascript中声明变量的方式有:varletconst

1.var

(1)作用域:

  整个函数范围内,或者是全局的

function func() {
if (true) {
var str = 'hello world';
}
console.log(str);
}

输出:

hello world

(2)允许在相同作用域内重复声明同一个变量

var var1 = 'var1 first.';
var var1 = 'var1 second.';
console.log(var1);

输出:

  var1 second.

(3)var可以先使用,后声明

var1 = 'var1 first.';
var var1;
console.log(var1);

输出:

  var1 first.

(4)声明后未赋值

var var1;
console.log(var1);

输出:

  undefined

2.let

(1)作用域:

  只在let命令所在的代码块内({})有效

function func() {
if (true) {
let str = 'hello world';
}
console.log(str);
}

报错:

Uncaught ReferenceError: str is not defined

(2)不允许在相同作用域内重复声明同一个变量

let var1 = 'var1 first.';
let var1 = 'var1 second.';
console.log(var1);

报错:

  Uncaught SyntaxError: Identifier 'var1' has already been declared

(3)let必须先声明后使用

var1 = 'var1 first.';
let var1;
console.log(var1);

报错:

  Uncaught ReferenceError: var1 is not defined

(4)声明后未赋值

let var1;
console.log(var1);

输出

  undefined

3.const

const声明一个只读的常量

(1)作用域:

  只在声明所在的块级作用域内有效

{
const PI = 3.1415;
}
console.log(PI);

报错:

  Uncaught ReferenceError: PI is not defined

正确的使用位置

{
const PI = 3.1415;
console.log(PI);
}

输出:

  3.1415

(2)声明之后值就不能改变

const PI = 3.1415;
PI=3;

报错:

  Uncaught TypeError: Assignment to constant variable.

(3)声明后必须立即初始化

const PI;
PI = 3.1415;
console.log(PI);

报错:

  Uncaught SyntaxError: Missing initializer in const declaration

(4)不允许在相同作用域内重复声明同一个变量的

const PI = 3.1415;
console.log(PI);
const PI = 3.1415926;
console.log(PI);

报错:

  Uncaught SyntaxError: Identifier 'PI' has already been declared

正确的用法

const PI = 3.1415;
var s= 3*3*PI;
console.log(s);

输出:

  28.273500000000002

4.常见的面试题

var msg = ["This", "is", "a", "test"];
for (var i = 0; i < msg.length; i++) {
console.log("outer:"+i);
setTimeout(function() {
console.log("index:" + i + ",msg:" + msg[i]);
}, 0);
}

输出: 

outer:0
outer:1
outer:2
outer:3
index:4,msg:undefined
index:4,msg:undefined
index:4,msg:undefined
index:4,msg:undefined

原因:

  setTimeout的执行方式是异步执行

  JavaScript 是单线程的,遇到setTimeout后会另开一条线程

  执行setTimeout里的代码时,同步代码for循环已经执行完成

  整个循环中只有一个iifor循环以及三个回调函数共用,循环结束后i=4,已经超出了原本数组的范围

把var 改成let

var msg = ["This", "is", "a", "test"];
for (let i = 0; i < msg.length; i++) {
console.log("outer:"+i);
setTimeout(function() {
console.log("index:" + i + ",msg:" + msg[i]);
}, 0);
}

输出:

  outer:0

  outer:1

  outer:2
  outer:3
  index:0,msg:This
  index:1,msg:is
  index:2,msg:a
  index:3,msg:test

原因:

  let所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束

暂时性死区:只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域, 不再受外部的影响

javascript中var、let、const的区别的更多相关文章

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

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

  2. ES6中var/let/const的区别

    let的含义及let与var的区别: let 声明的变量只在它所在的代码块有效: 如下: for (let i = 0; i < 10; i++) { console.log(i); } con ...

  3. 【前端面试】(四)JavaScript var let const的区别

    视频链接: JavaScript var let const的区别 - Web前端工程师面试题讲解 参考链接: JavaScript 变量 JavaScript Let JavaScript Cons ...

  4. JavaScript中var和this定义变量的区别

    JavaScript中var和this定义变量的区别 在js中声明变量时可以使用var和this,但使用this的有很大一部分参考书是没有的,经过查阅相关资料总结如下: 用var和this声明变量,存 ...

  5. JavaScript中:表达式和语句的区别

    JavaScript中:表达式和语句的区别 Javascript语言精粹:表达式是由运算符构成,并运算产生结果的语法结构.程序是由语句构成,语句则是由“:(分号)”分隔的句子或命令.如果在表达式后面加 ...

  6. var let const 的区别

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

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

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

  8. JavaScript中var、let和const的区别(转载)

    一.前言 在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . c ...

  9. javascript中var、let和const的区别

    在javascript中,var.let和const都可以用来声明变量,那么三者有什么区别呢?要回答这个问题,我们可以从先想想:三种不同的声明会影响变量的哪些方面?这些方面也就是变量的特性,那么变量有 ...

随机推荐

  1. NetEQ主要文件简介

    accelerate.h,accelerate.cc 加速操作,对语音信号处理以实现快速播放. Accelerate类继承自父类TimeStretch,大多数功能由TimeStretch实现. Ret ...

  2. C++对象内存模型2 (虚函数,虚指针,虚函数表)(转)

    class A { public: virtual void vfunc1(); virtual void vfunc2(); void func1(); void func2(); virtual ...

  3. .dxf文件

    DXF 是 AutoCAD 与其它软件之间进行 CAD 数据交换的开放矢量数据文件格式,可以分为两类:ASCII 格式和二进制格式:ASCII 具有可读性好的特点,但占用的空间较大:二进制格式则占用的 ...

  4. python--递归函数讲解

    递归算法是一种直接或间接调用自身算法的过程. 递归算法解决问题的特点: (1)递归就是在过程或函数里调用自身 (2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口. (3)递归算法解题通 ...

  5. 牛客练习赛55 E 树

    题目链接: 题意:给出n个点,n-1条边求任意两个点的距离平方的和 解法: f[i]表示这个点的高度 sz[i]表示这个子树的大小 szz[i]表示这个这个子树大小的平方 sum[i]表示这个子树所有 ...

  6. 删除ubuntu旧内核的方法

    https://www.jianshu.com/p/75edb9a5fbab 磁盘满了 需要清理系统盘 1,先用uname -a 查看当前内核版本: uname -a Linux 10-9-37-13 ...

  7. cronicle minio s3 存储配置集成

    cronicle 后端存储是可配置的 ,通过使用不同的存储配置,我们可以解决多实例部署以及数据共享的问题 cronicle 的后端存储模型,设计的特别方便,包含了基于文件的,基于s3 的,同时我们也可 ...

  8. 12-网页,网站,微信公众号基础入门(编写后台PHP程序,实现Airkiss配网)

    https://www.cnblogs.com/yangfengwu/p/11067590.html 首先说一下,这两个地方需要配置一样 网站根目录建个文件夹 airkiss的文件夹 里面放上 ind ...

  9. A1139 | 玩成模拟题的DFS

    考试的时候有思路了,但是没写完.这题起码要40min写,思路太诡异了. 刚刚写了一段,只过了一个case,得了18分,还行.明日再战. #include <stdio.h> #includ ...

  10. nginx 访问控制之 user_agent

    user_agent大家并不陌生,可以简单理解成浏览器标识,包括一些蜘蛛爬虫都可以通过user_agent来辨识. 通过访问日志,可以发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好. 为了减少 ...