您现在的位置是:首页 > 编程 > 

JS中var、let和ct的区别详解

2025-07-25 11:33:09
JS中var、let和ct的区别详解 一、概述在ES5中,声明变量只有var关键字,声明函数只有function关键字;因为var声明的变量,内层变量可能覆盖外层变量的问题以及用来计数的循环变量泄露为全局变量;在ES6之后,声明的方式有 var 、 let 、 ct 、 function 、 class,我们来重点讨论var、let和ct的区别;二、var1、作用域说明:使用va

JS中var、let和ct的区别详解

一、概述

在ES5中,声明变量只有var关键字,声明函数只有function关键字;

因为var声明的变量,内层变量可能覆盖外层变量的问题以及用来计数的循环变量泄露为全局变量;

在ES6之后,声明的方式有 var 、 let 、 ct 、 function 、 class,我们来重点讨论var、let和ct的区别;

二、var

1、作用域

说明:

使用var声明一个变量,如果在函数之内,则作用域在当前函数之内;如果在函数之外,则作用域在全局;

代码演示:
代码语言:javascript代码运行次数:0运行复制
<template>
	<div>
		<h1>学习测试!</h1>
	</div>
</template>

<script>
	var a = 1;//此时a在函数外,是全局变量
	export default{
		data() {
			return {
				
			}
		},
		created() {
			//页面创建之后,分别调用两个函数进行测试
			this.init();
			this.initEnd();
		},
		methods:{
			init(){
				var b = 2;//此时b在函数体之内,作用域仅在当前函数体内
				cole.log("A" + a);//这里能输出
				cole.log("B" + b);//这里能输出
			},
			initEnd(){
				cole.log("A" + a);//这里能输出
				cole.log("B" + b);//这里会报错:ReferenceError: b is not defined
			}
		}
	}
</script>

<style lang="less" scoped>
</style>
运行结果:

2、提升

定义:

函数声明和变量声明总是被JavaScript解释器隐式地提升(hoist)到包含他们的作用域的最顶端;

无论 var 出现在一个作用域的哪个位置,这个声明都属于当前的整个作用域,在其中到处都可以访问到;

只有变量声明才会提升,对变量赋值并不会提升;

代码语言:javascript代码运行次数:0运行复制
cole.log(a);//undefined
var a = 1;

该代码段跟下列代码段是一样的逻辑:

代码语言:javascript代码运行次数:0运行复制
var a;
cole.log(a);//undefined
a = 1;

而如果对未声明过的变量进行操作,就会报错:

代码语言:javascript代码运行次数:0运行复制
cole.log(b);//假设b未声明过,Uncaught ReferenceError: b is not defined
三、let
说明:

let是块级作用域,函数内部使用let定义后,对函数外部无影响;

let 声明的变量不存在变量提升(?),换一种说法,就是 let 声明存在暂时性死区(TDZ);

代码演示:
代码语言:javascript代码运行次数:0运行复制
<template>
	<div>
		<h1>学习测试!</h1>
	</div>
</template>

<script>
	let a = 100;
	export default{
		data() {
			return {
				
			}
		},
		created() {
			//页面创建之后,分别调用两个函数进行测试
			this.init();
			this.initEnd();
		},
		methods:{
			init(){
				let a = 1;
				cole.log("A" + a);//1
			},
			initEnd(){
				cole.log("A" + a);//100
			},
		}
	}
</script>

<style lang="less" scoped>
</style>
运行结果:
一个大大的疑问:

网上都说let声明的变量不存在变量提升,但是我在vue中声明的let变量就存在变量提升!

未声明演示:

代码语言:javascript代码运行次数:0运行复制
<template>
	<div>
		<h1>学习测试!</h1>
	</div>
</template>

<script>
	export default{
		data() {
			return {
				
			}
		},
		created() {
			//页面创建之后,分别调用两个函数进行测试
			this.init();
		},
		methods:{
			init(){
				let a = 1;
				cole.log("A" + a);
				cole.log("B" + b);//未声明b
			},
		}
	}
</script>

<style lang="less" scoped>
</style>

未声明运行结果:

声明为let变量演示:

代码语言:javascript代码运行次数:0运行复制
<template>
	<div>
		<h1>学习测试!</h1>
	</div>
</template>

<script>
	export default{
		data() {
			return {
				
			}
		},
		created() {
			//页面创建之后,分别调用两个函数进行测试
			this.init();
		},
		methods:{
			init(){
				let a = 1;
				cole.log("A" + a);
				cole.log("B" + b);
				let b = 2; //声明let b
			},
		}
	}
</script>

<style lang="less" scoped>
</style>

声明为let变量演示结果:

结语:我不知道这是为什么,可能是vue的原因吧,我是个前端初学者;

一个经典的关于 var 和 let 的一个例子:
代码语言:javascript代码运行次数:0运行复制
for (var i = 0; i < 10; i++) {
    setTimeout(function(){
        cole.log(i);
    },100)
};

该代码运行后,会在控制台打印出10个10,如果修改为(使用let,暂时性死区):

代码语言:javascript代码运行次数:0运行复制
for (let i = 0; i < 10; i++) {
    setTimeout(function(){
        cole.log(i);
    },100)
};

则该代码运行后,就会在控制台打印出0-9;

四、ct

1、ct定义的变量不可修改

说明:

ct除了具有let的特征外,ct定义的变量,一旦定义必须立即赋值,且之后不可修改,也就是常量

代码演示:
代码语言:javascript代码运行次数:0运行复制
<template>
	<div>
		<h1>学习测试!</h1>
	</div>
</template>

<script>
	let a = 100;
	export default{
		data() {
			return {
				
			}
		},
		created() {
			//页面创建之后,分别调用两个函数进行测试
			this.init();
		},
		methods:{
			init(){
				ct a = 1;
				cole.log("A" + a);//1
				a = 2;
				cole.log("A" + a);
			},
		}
	}
</script>

<style lang="less" scoped>
</style>
运行结果:

2、真的不可以修改吗

代码演示:
代码语言:javascript代码运行次数:0运行复制
<template>
	<div>
		<h1>学习测试!</h1>
	</div>
</template>

<script>
	let a = 100;
	export default{
		data() {
			return {
				
			}
		},
		created() {
			//页面创建之后,分别调用两个函数进行测试
			this.init();
		},
		methods:{
			init(){
				ct obj = {a:1,b:2};
				cole.log(obj.a);//1
				obj.a = ;
				cole.log(obj.a);//
			},
		}
	}
</script>

<style lang="less" scoped>
</style>
运行结果:

准确的说,是 ct 声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配;

五、总结

var 声明的变量属于函数作用域,let 和 ct 声明的变量属于块级作用域;

var 存在变量提升现象,而 let 和 ct 没有此类现象;

var 变量可以重复声明,而在同一个块级作用域,let 变量不能重新声明,ct 变量不能修改;

六、参考资料

(不分先后顺序,感谢这些文章的作者!)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent 删除作用域var变量测试函数

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1198010.html

相关标签:无
上传时间: 2025-07-23 10:26:07
留言与评论(共有 11 条评论)
本站网友 冷光烟花
29分钟前 发表
就会在控制台打印出0-9;四
本站网友 如何生双胞胎
7分钟前 发表
函数内部使用let定义后
本站网友 深圳酒吧
19分钟前 发表
我们来重点讨论var
本站网友 民航局网站
28分钟前 发表
就会在控制台打印出0-9;四
本站网友 悦府山水
19分钟前 发表
initEnd(){ cole.log("A" + a);//这里能输出 cole.log("B" + b);//这里会报错:ReferenceError
本站网友 金色橄榄城
4分钟前 发表
也就是常量;代码演示:代码语言:javascript代码运行次数:0运行复制<template> <div> <h1>学习测试!</h1> </div> </template> <script> let a = 100; export default{ data() { return { } }
本站网友 股票名词解释
24分钟前 发表
如有侵权请联系 cloudcommunity@tencent 删除前往查看作用域var变量测试函数
本站网友 工程进度款
11分钟前 发表
分别调用两个函数进行测试 this.init(); this.initEnd(); }
本站网友 大智路
12分钟前 发表
2}; cole.log(obj.a);//1 obj.a = ; cole.log(obj.a);// }
本站网友 红糖水的功效与作用
5分钟前 发表
就是 let 声明存在暂时性死区(TDZ);代码演示:代码语言:javascript代码运行次数:0运行复制<template> <div> <h1>学习测试!</h1> </div> </template> <script> let a = 100; export default{ data() { return { } }