JS中变量的定义方式有四种

不写var,let,const--直接定义变量

a = 10;

使用var关键字定义

var a = 10;

使用let关键字定义

let a = 10;

使用const关键词定义

const a = 10;

var

var定义的变量可以重新声明和修改

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

作用域

  • 在函数外部使用var关键字定义的变量是全局变量--在函数内部定义的var变量是局部变量
  • 未使用任何关键字定义的变量是全局变量
//在函数外部使用var关键字声明一个变量var1
var var1 = '变量1';
//定义一个函数test1
function test1() {
//在函数内部不使用关键字定义一个变量var2
var2 = '变量2';
//在函数内部使用var关键字声明一个变量var3
var var3 = '变量3';//局部变量
}
//调用函数
test1();
console.log(var1);//变量1
console.log(var2);//变量2
console.log(var3);//报错--未定义

var声明的全局变量与局部变量重名

//在函数外部使用var关键字定义变量var1
var var1 = '函数外';
function test1() {
//在函数内部使用var定义变量var1
var var1 = '函数内';
//函数内输出var1
console.log(var1);
}
//调用函数
test1();
//全局作用域输出var1
console.log(var1);
  • 函数内部输出的var1是函数内部的局部变量覆盖函数外部的全局变量的结果
  • 全局作用域输出为--函数执行完毕--局部变量失效--输出全局变量

块作用域

//使用关键字var声明全局变量a
var a = 1;
//判断a是否和1全等
if (a === 1) {
//若全等--使用var关键字声明块作用域变量b
var b = 2;
}
//使用var关键字声明块作用域变量i
for (var i = 0; i < 5; i++) {
document.write(i);
}
//输出块作用域变量b和i
console.log(b); //2
console.log(i); //5
  • 在if块和循环体内部使用var谷关键字定义的变量--是全局变量

变量提升

var变量声明会被提升到其作用域的顶部--并且会使用undefined值对其进行初始化

//在函数外使用var关键字声明变量test_var
var test_var = "函数外的test_var";
//定义函数testFun
function testFun() {
//打印输出test_var
console.log(test_var); //undefined
//函数内使用var关键字定义的test_var
var test_var = "函数内的test_var";
//再次打印输出test_var
console.log(test_var); //函数内的test_var
}
//函数执行
testFun();

上述代码执行顺序

//在函数外使用var关键字声明变量test_var
var test_var = "函数外的test_var";
//定义函数testFun
function testFun() {
//声明被提升到顶部
var test_var;
//打印输出test_var
console.log(test_var);
//函数内使用var关键字定义的test_var
test_var = "函数内的test_var";
//再次打印输出test_var
console.log(test_var);
}
//函数执行
testFun();
  • 代码执行前--变量和函数声明会移至其作用域的顶部
  • 变量提升只提升声明部分--不提升赋值部分

let

  • let声明的变量可以被修改但不能重新声明
let a = 1;
let a = 3;
console.log(a);`//报错

块作用域

  • let关键字有块作用域--块是由{ }界定的代码块--大括号内的任何内容都包含在一个块级作用域中--let声明的函数尽在该块中使用
//在函数外使用let关键字声明变量test_var
let test_var = "函数外的test_var";
//定义函数testFun
function testFun() {
//打印输出test_var
console.log(test_var); //报错
//在函数内使用let关键字声明变量test_var
let test_var = "函数内的test_var"
//打印输出test_var
console.log(test_var);
}
//函数执行
testFun();

变量提升

  • let声明也会被提升到作用域的顶部

    • let声明的变量会被提升到作用域的顶部--但不会对值进行初始化
    • 在声明前使用let变量会报错
//循环体
for (let v = 0; v < 5; v++) {
//在循环体内输出v
console.log(v); //01234
}
//在循环体外输出v
console.log(v); //报错--未定义
  • let关键字声明的变量有块作用域--循环体外不能访问在循环体内部定义的变量

const

  • const声明与let声明一样--只能在声明它们的块级作用域内访问
  • const不能被修改--也不能被重新声明
const a = 10;
a = 20; //报错
  • const声明必须在声明时进行初始化
  • const与let一样--声明会被提升到顶部--但没有初始化

var,let,const的区别

  • var声明的变量可以重新声明,可以修改;let声明的变量不能重新声明,但可以修改;const声明的变量不能重新声明也不能修改
  • var的作用域是全局作用域或函数作用域,无块级作用域;let和const有块级作用域
  • var声明的变量会被提升至作用域的顶部,并赋初始值为undefined;let和const声明的变量会被提升至顶部,但不会赋初始值

var,let,const的区别的更多相关文章

  1. var let const 的区别

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

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

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

  3. js中定义变量之②var let const的区别

    var 上一篇文章有讲过,是js定义变量的关键词. 但是在es6中,新添加了两个关键词,用于变量声明的关键词:let 和const 接下来就说一下var let 和const的区别: 首先说var 用 ...

  4. let、var、const用法区别

    1.var var 声明的变量为全局变量,并会进行变量提升:也可以只声明变量而不进行赋值,输出为undefined,以下写法都是合法的. var a var a = 123  2.let let 声明 ...

  5. JS中let、var、const的区别

    先看let和var: 1. console.log(a); // undefined var a = 3; console.log(a); // Uncaught ReferenceError: Ca ...

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

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

  7. var let const的区别

    1. 变量提升: 浏览器在运行代码之前会进行预解析,不论var声明的变量处于当前作用域的第几行,都会提升到作用域的头部.   2. 只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不 ...

  8. ES6 新增声明变量的 var let const 的区别详解

    var 如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域. let 1.let 声明的变量具有块作用域的特征 ...

  9. 【ES6 】var/let/const的区别

    var 声明变量 没有区级作用域 可以预解析 可以重复定义 声明的全局变量属于顶层对象(window)的属性 let 声明变量 有块级作用域 没有预解析 不可以重复定义 声明的全局变量不属于顶层对象( ...

  10. let、var、const声明的区别

    前言 看了方应杭老师的一篇解释let的文章,对JavaScript中的声明有了深刻的理解,这里也就有了总结一下JavaScript中各种声明之间区别的这篇文章. JavaScript中变量声明机制 首 ...

随机推荐

  1. markdown常用语法及Typora的使用

    一.markdown markdown简介   markdown是一种文档格式,后缀名为.md.markdown非常适于写博客,基本所有博客网站都支持markdown语法格式. 1.标题   mark ...

  2. 继续Vue的探索

    接上集 上次到了想要利用Vue实现隔行变色的请求,但是由于使用的代码过于"高级"导致无法识别,这就需要利用webpack来解决它! webpack的基本使用 1.首先,在项目中安装 ...

  3. Ubuntu18.04二进制安装elasticsearch

    1. 什么是Elasticsearch Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎.Logstash 和 Beats 有助于收集.聚合和丰富您的数据并将 ...

  4. SpringBoot——静态资源及原理

    一.使用 SpringBoot 的步骤 [1]创建 SpringBoot应用,选中自己需要的模块.[2]SpringBoot 已经默认将这些场景配置好,只需要在配置文件中指定少量配置就可以运行起来.[ ...

  5. 对比 elasticsearch 和 mysql

    最近阅读了elasticsearch的官方文档,学习了它的很多特性,发现elasticsearch和mysql有很多地方类似,也有很多地方不同.这里做一个对比,帮助大家加深对elasticsearch ...

  6. MapReduce之简单的数据清洗----课堂测试

    今天的课堂测试第一步是做简单的数据清洗,直到现在我才知道只是把文本文件的数据改成相应的格式,而我做的一直是寻找一条数据,并转换成相应的格式,但是呢,我感觉还是很高兴的,虽然没有按时完成任务,但也学到了 ...

  7. 非常小的一个东西,Spring依赖注入Bean类型的8种情况

    大家好,我是三友~~ 今天来讲一个可能看似没有用但是实际又有点用的一个小东西,那就是@Autowired支持注入哪些Bean的类型. 为啥要讲这个呢? 故事说起来可能就比较长了. 不过长话可以短说,仅 ...

  8. Three.js 进阶之旅:全景漫游-初阶移动相机版

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 摘要 3D 全景技术可以实现日常生活中的很多功能需求,比如地图的街景全景模式.数 ...

  9. kubernetes核心实战(二)---Pod+ReplicaSet

    3.pod Pod 是可以在 Kubernetes 中创建和管理的.最小的可部署的计算单元. Pod (就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器:这些容器共享存储.网络.以及怎样运行这些容 ...

  10. python入门教程之六运算符

    什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. Python语言支持以下类型的运算 ...