var:

1)声明作用域:在函数内部,使用var定义一个变量(局部变量),在函数被调用完之后,该变量会被立即销毁。在定义变量时如果省略var,就会创建一个全局变量(不建议在局部作用域中定义全局变量,难维护,而且在严格模式下,会导致抛出ReferenceError)。

2)声明提升:把所有变量声明都拉到函数作用域的顶部。

function foo(){
console.log(age);
var age = 18;
}

其实和下面得一样

function foo(){
var age;
console.log(age);
age = 18;
}
foo();//undefined

3)可以反复多次使用var声明同一个变量。

function foo(){
var age = 16;
var age = 1;
var age = 2;
console.log(age);
}
foo();//2

4)全局声明:使用var在全局作用域中声明的变量会成为window对象的属性。

var age = 18;console.log(window.age);//18

let:

1)声明作用域:let声明的是块作用域,而var声明的是函数作用域。块作用域是函数作用域的子集,所以var作用域的限制同时也适用于let。

//var
if(true){
var age = 18;
console.log(age);//18
}
console.log(age);//18 //let
if(true){
let age = 18;
console.log(age);//18
}
console.log(age);//ReferenceError:age没有定义

2)声明提升:let声明的变量不会在作用域中被提升

3)不可以在一个块中反复多次使用let声明同一个变量

let age;
let age;//SyntaxError,标识符age已经声明过了

4)全局声明:使用let在全局作用域中声明的变量不会成为window对象的属性,但是var声明的变量会。

let age = 18;
console.log(window.age);//undefined

5)条件声明:在使用var声明变量时,由于声明会被提升,js会自动将多余的声明在作用域顶部合并为一个声明。而因为let的作用域是块,所以不可能检查前面是否已经使用let声明过同名变量。因此对于let,不能依赖条件声明模式。

6)for循环中的let声明:在用let声明迭代变量时,js在后台会为每个迭代变量声明一个新的迭代变量,每个setTimeout引用的都是不同的迭代变量。for-in 和for-of都适用。

for(var i=0;1<5;i++){}
console.log(i); //5 for(let i=0;1<5;i++){}
console.log(i); //ReferenceError:i没有定义
for(var i=0;1<5;i++){
setTimeout(()=>console.log(i),0);
}
//会输出5,5,5,5,5 for(let i=0;1<5;i++){
setTimeout(()=>console.log(i),0);
}
//会输出0,1,2,3,4

const:

1)const的行为和let基本相同,唯一的区别是const它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行时错误(TypeError)。

2)不允许重复声明

3)作用域也是块

4)const声明的限制只适用于它指向的变量的引用。换句话说,如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。

const person = {};
person.name = "dage";

5)不能用const声明迭代变量,因为迭代变量会自增。但是可以声明一个不会被修改的for循环变量。这对for-in 和for-of循环特别有意义。

声明风格及最佳实践:先使用const,let次之,不使用var。

JavaScript var,let,const三个关键字的区别的更多相关文章

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

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

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

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

  3. JavaScript var, let, const difference All In One

    JavaScript var, let, const difference All In One js var, let, const 区别 All In One 是否存在 hoisting var ...

  4. php中this,self,parent三个关键字的区别辨析

    php中this,self,parent三个关键字的区别辨析 一.总结 一句话总结:this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用. 1.self关键字使用 ...

  5. JavaScript—var lef const区别

    今天刚刚学JavaScript 因为以前学过.学起来也就轻松.今天在练习.流程控制语句的时候,用WebStrom 写的时候 var 声明变量的时候 下面老是有一条白线.开始以为是开发环境有问题 然后, ...

  6. javascript函数命名的三种方式及区别

    1, function fn(val1,val2) { alert(val1+val2); } fn(1,2); 2, var fn=function() { alert(val1+val2); } ...

  7. final、finally、三个关键字的区别

    一 final 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以 ...

  8. java中final,finally,finalize三个关键字的区别

    final 可以作为修饰符修饰变量.方法和类. 被final修饰的变量必须在初始化时给定初值,以后在使用时只能被引用而不能被修改. 被final修饰的方法不能够在子类中被重写(override): 被 ...

  9. Java中 intValue,parseInt,Valueof 这三个关键字的区别

    intValue()是把Integer对象类型变成int的基础数据类型: parseInt()是把String 变成int的基础数据类型: Valueof()是把给定的String参数转化成Integ ...

随机推荐

  1. 使用pdfFactory为PDF文件设定查看选项

    一般情况下,大部分PDF文件都会按照默认的查看设置,以100%的尺寸显示第一页的内容.但在一些特殊情况下,PDF文件的创建者会设定其他的文件查看尺寸,或设定打开页为第N页,来达到引起阅读者关注的目的. ...

  2. C语言模拟实现先来先服务(FCFS)和短作业优先(SJF)调度算法

    说明 该并非实现真正的处理机调度,只是通过算法模拟这两种调度算法的过程. 运行过程如下: 输入进程个数 输入各个进程的到达事件 输入各个进程的要求服务事件 选择一种调度算法 程序给出调度结果:各进程的 ...

  3. celery原理与组件

    1.Celery介绍 https://www.cnblogs.com/xiaonq/p/11166235.html#i1 1.1 celery应用举例 Celery 是一个 基于python开发的 分 ...

  4. P1633 二进制

    首先将 \(A,B,C\) 二进制中 \(1\) 的个数和最大长度 \(L\) 算出来. 接着考虑二进制位相加的情况: 低位不进上来. \(X\) 和 \(Y\) 中的两个 \(1\) 合成 \(Z\ ...

  5. EXCEL发送为只读打开

    (1)进入文件夹: C:\Users\xxx\AppData\Roaming\Microsoft\Windows\SendTo (2)新建快捷方式 (3)输入: "C:\Program Fi ...

  6. java数组作为函数返回值

    1 //将一个二维数组行和列元素互换.存到另一个二维数组 2 package test; 3 4 public class test1_8 { 5 public static int[][] huhu ...

  7. 40 张图带你搞懂 TCP 和 UDP

    前言 欢迎阅读「程序员cxuan」 的文章,从今往后,你就是我的读者了. 我的 github bestJavaer 已经收录此文章,目录在 https://github.com/crisxuan/be ...

  8. Django 在test.py 中测试文件的配置

    import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTING ...

  9. JZOJ2020年8月12日提高组反思

    JZOJ2020年8月12日提高组反思 真·难亿一点点 T1 题目长并附带伤害-- 暴力搜 对于字符串,我选择\(Pascal\) T2 概率问题,再见 T3 样例没懂,再见 T4 有史以来见过的条件 ...

  10. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项标记flags相关方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeWidgetItem项可以通过flags()返回项的标记,返回值类型为类型Qt.ItemF ...