let 和 var 定义变量的区别
一、变量提升
var 存在变量提升,而 let 不存在变量提升,所以用 let 定义的变量一定要在声明后再使用,否则会报错。
var
//var定义的变量存在变量提升,变量会把声明提升到整个作用域的最前面
//例子1
console.log(a); //undefined
var c=; //等价于
var c;
console.log(a); //undefined
c=; /*------------------------*/
//例子2
var a=;
function func(){
console.log(a); //undefined
var a=;
console.log(a); //
}
func(); //调用函数 //等价于
var a=;
function func(){
var a;
console.log(a); //undefined
a=;
console.log(a); //
}
func(); //调用函数 //注意:
//对于不声明而直接赋值的变量,相当于全局变量,赋值之后才可以使用,赋值之前会报错
console.log(a); //报错:a is not defined
a=;
console.log(a); //
let
//let定义的变量不存在变量声明,变量在声明前使用会报错
//例子1
console.log(a); //报错 a is not defined
let a=; //例子2
function func(){
console.log(a);
let a=;
}
func();//调用函数
二、作用域
var:只有全局作用域和函数作用域概念,没有块级作用域的概念。
let:只有块级作用域的概念 ,由 { } 包括起来,if语句和for语句里面的{ }也属于块级作用域。
var
//全局作用域例子
//也就是除了在函数内部定义的变量,其他都是全局变量。
for(var i=;i<;i++){
;
}
console.log(i); // 100 //函数作用域例子,如下 b会输出10 ,而a会报错“a is not defined”,为什么呢?
//因为对于不声明而直接赋值的变量(b),相当于全局变量。
//而对于在函数里声明赋值的变量(a),它只在函数内部有效,外部无法访问,否则会报错 function func(){
b=;
var a=;
}
func();//调用函数
console.log(b); //
console.log(a); //报错 a is not defined
/*补知识
函数的语法:自调用函数,也就是会定义并调用该函数
(function(){ })();
*/
//考一考
(function(){
var a=b=;
})();
console.log(b);
console.log(a); //问题:a和b分别会输出什么呢? //答案:b会输出100,而a会报错“a is not defined” //为什么呢? //首先,将该函数分解为我们所熟悉的写法
(function(){
var a=;
b=;
})();
console.log(b); //
console.log(a); // 报错 a is not defined; //由此,可以看出了吧?这是前面所说的“函数的作用域”:b相当于全局变量,而a只作用于该函数内,外部访问不了。
let
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。在代码块中,使用let命令声明变量之前,该变量都是不可用的,这在语法上称为“暂时性死亡”
//例子1
//会报错“a is not defined”,因为在if代码块内,使用let声明变量之前,该变量都是不可用的,否则会报错
if(true){
a=;
let a;
} //例子2
//会报错“i is not defined”,因为用let定义的i只在for循环体内有效
for(let i=;i<;i++){
;
}
console.log(i)
三、重复声明
var:变量可以多次声明
let:变量不允许重复声明,let不允许在相同作用域内,重复声明同一个变量。不能在函数内部,重新声明同一个参数
var
var a=;
function func(){
console.log(a); // undefined
var a=;
console.log(a); //
}
func();
console.log(a); //
var a;
console.log(a); //
var a =;
console.log(a); // 12 //这个其实涉及到的是var的变量可重复声明和变量提升
//以上其实可以等价于
var a;
a=;
function func(){
var a;
console.log(a); // undefined
a=;
console.log(a); //
}
func();
console.log(a); // console.log(a); //
a =;
console.log(a); // 12 //这样,相信很容易得出正确的答案
let
//例子1
//会报错“Identifier 'a' has already been declared”
var a=;
let a=; //例子2
//不会报错,因为a可以在不同作用域内声明的。
let a='hello';
{
let a='hi';
console.log(a); // hi
}
console.log(a); // hello //例子3
//会报错" Identifier 'a' has already been declared",因为var定义的变量会发生变量提升。
let a='hello';
{
var a='hi';
console.log(a);
}
console.log(a); //例子4
//会报错“Identifier 'a' has already been declared”,
//不能在函数内部重复声明同一个参数,因为参数变量是默认声明的,所以不能用let或const再次声明
function func(a){
let a='hello';
console.log(a);
}
func('hi');
转载 https://blog.csdn.net/qq_41638795/article/details/81318704
let 和 var 定义变量的区别的更多相关文章
- es6的let与es5的var定义变量的区别
es6的let与es5的var定义变量的区别 自身新手第一次接触let关键字的时候,不知道let与var的区别,本能认为是一样,但非如此,比如下述的代码运行就会报错: let hello = 'hel ...
- 【转载】浅谈JavaScript,let和var定义变量的区别
了解JS与ES5与ES6区别 JS语言 JavaScript一种动态类型.弱类型.基于原型的客户端脚本语言,用来给HTML网页增加动态功能. 动态: 在运行时确定数据类型.变量使用之前不需要类型声明, ...
- let 和 var定义变量的区别-盼盼Degenerate
let和var关键字的区别 声明后未赋值,表现相同 (function() { var varTest; let letTest; console.log(varTest); //输出undefine ...
- ts和js中let和var定义变量的区别
javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是”JavaScript 严格模式”,比如下述的代码运行就会报错: let hello = 'hello worl ...
- js中let和var定义变量的区别
let变量之前没见过,刚遇到,探探究竟. 以下转自:http://blog.csdn.net/nfer_zhuang/article/details/48781671 声明后未赋值,表现相同 (fun ...
- let和var定义变量的区别
使用 let 语句声明一个变量,该变量的范围限于声明它的块中. 可以在声明变量时为变量赋值,也可以稍后在脚本中给变量赋值. 使用 let 声明的变量,在声明前无法使用,否则将会导致错误. 如果未在 ...
- JavaScript中var和this定义变量的区别
JavaScript中var和this定义变量的区别 在js中声明变量时可以使用var和this,但使用this的有很大一部分参考书是没有的,经过查阅相关资料总结如下: 用var和this声明变量,存 ...
- C#使用var定义变量时的四个特点
使用var定义变量时有以下四个特点: 1. 必须在定义时初始化.也就是必须是var s = “abcd”形式: 2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了. 3. var要求是 ...
- var与this定义变量的区别以及疑惑
我们知道: var可以定义一个局部变量,当然如果var定义在最外层的话,就是全局的局部变量,也就算是全局变量了. 而this关键字定义的变量准确的说应该算是成员变量.即定义的是调用对象的成员变量. 另 ...
随机推荐
- WebRTC搭建前端视频聊天室——数据通道篇
本文翻译自WebRTC data channels 在两个浏览器中,为聊天.游戏.或是文件传输等需求发送信息是十分复杂的.通常情况下,我们需要建立一台服务器来转发数据,当然规模比较大的情况下,会扩展成 ...
- aardio类的例子
论坛里面相关资料太少,这里贴一下 库需要在工程的lib目录下,在ide里面就是用户库目录,比如 my_lib namespace my_lib{ import console class MyLibC ...
- IfcBeam属性
IfcBeam属性和结构 <xs:element name="IfcBeam" type="ifc:IfcBeam" substitutionGroup= ...
- Flutter中极光推送的使用----jpush_flutter
原文地址:https://www.cnblogs.com/niceyoo/p/11095994.html 1.申请极光账号和建立应用 极光推送的官方网址为:https://www.jiguang.cn ...
- 阶段一-01.万丈高楼,地基首要-第3章 用户登录注册模块开发-3-8 优化Swagger2显示
左侧的全是英文 忽略api 把HelloController也忽略掉 重启api的服务,刷新页面.只剩下了passport的Controller 给passport接口加上注解. 重启服务,并刷新页面 ...
- (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究
使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究 Author:lihaiping1603@aliyun.com Create:2019-09-04 最近对ffmpeg给视频文件添加字幕效果 ...
- Elasticsearch学习之集群常见状况处理(干货)
1. 集群健康状况处理 当集群处于yellow或者red状态的时候,整体处理步骤如下: (1) 首先查看集群状态 localhost:/_cluster/health?pretty { "c ...
- react-native-cli 安装
react-native-cli 安装 1.按照依赖https://reactnative.cn/docs/getting-started.html 2.查看设备是否连接adb devices 3.运 ...
- ssh_exchange_identification: read: Connection reset by peer 解决思路
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Jdk_yxs/article/deta ...
- locale区域语言设置
查看当前配置 # 默认配置[maintain@localhost:~]$ locale LANG=zh_CN.utf8 LC_CTYPE="zh_CN.utf8" LC_NUMER ...