我是靠谱客的博主 虚心墨镜,最近开发中收集的这篇文章主要介绍var/let/const最佳实践讲解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


var/let作用域区别:



1. 全局作用域访问不同

var可以被顶级window访问

	<script>
var a = 12;
function f() {};
console.log(window.a); // 12
console.log(window.f); // f(){}
</script>

let/const不可被顶级window访问

	<script>
let a1 = 1;
let b1 = 2;
console.log(window.a1); //undefined
console.log(window.b1); //undefined
console.log(a1);
console.log(b1);
</script>

解析let/const块级作用域:

	<script type="text/javascript">
let a2 = 10;
const b2 = 20;
// 解析后相当于如下:
(function() {
var a2 = 10;
var b2 = 20;
})
</script>

2. 函数作用域相同

var 在函数作用域定义报defined

	<script type="text/javascript">
var a3 = 123;
// 函数外部声明作用域为全局
(function () {
var b3 = 321;
// 变量b的作用域只存在函数内部
console.log(b3); // 输出 321
})()
console.log(a3); // 输出 123
console.log(b3); // 报错:b3 is not defined
</script>

let在函数作用域定义报defined

	<script type="text/javascript">
let a4 = 123;
// 函数外部声明作用域为全局
(function () {
let b4 = 321;
// 变量b的作用域只存在函数内部
console.log(b4); // 输出 321
})()
console.log(a4); // 输出 123
console.log(b4); // 报错:b4 is not defined
</script>





var/let定义区别不同



1. 定义

var定义:会将声明提到最前面


console.log(varDemo1); // 输出: undefined
if (true) {
var varDemo1 = "this is var "
console.log(varDemo1); // 输出:this is var 
}
console.log(varDemo1); // 输出:this is var

let定义: 不会将声明声明提前,直接报错


console.log(letDemo1);
// 报错:letDemo1 is not defined
if (true) {
let letDemo1 = "this is let";
console.log(letDemo1); // 输出:this is let
}
console.log(letDemo1); // 报错:letDemo1 is not defined

2. 重定义

var 重定义如同重新赋值


// 重定义:
var varDemo = 10;
var varDemo = 13;
console.log(varDemo); // 输出:13

let 重定义报错


let letDemo = 10;
let letDemo = 13; //抛出语法错误:'letDemo' has already been declared
console.log(letDemo);

3. 内层for循环定义

var for循环内层定义:每次回调相同的值:


const things = 0
for (var i = 3; i > things; i--) {
setTimeout(function() {
console.log(i); //输出:0 0 0
}, 1000)
}

let for循环内存定义:每次迭代创建新绑定


const thingLet = 0;
for (let i = 3; i > thingLet; i--) {
setTimeout(function() {
console.log(i); // 输出:3 2 1 
}, 1000)
}

4. let存在暂时性死区

先使用var声明,里面使用let声明则会报错,如果都使用var则不会。

	<script type="text/javascript">
var value = 111;
if (true) {
value = "abc"; // 报错: value is not defined
let value;
}
</script>





var/let混合使用

函数外定义:
注意:使用let先声明,var后声明同样如此

	<script type="text/javascript">
var ab = 1;
let ab = 1; // 报错:dentifier 'ab' has already been declared
</script>

函数内定义

注意:即使let和var调换位置,也是输出的外层定义输出2,相同的是如果定义一个对象亦是如此

<script type="text/javascript">
let aa = "2"
function abc() {
var aa = 23
}
console.log(aa); // 输出:2
console.log(abc);
</script>





特殊的const常量


const 拥有与let相同的块级作用域

const 不可以声明,只能定义


const const1;
//报错:Missing initializer in const declaration

const 不可以重定义


const const2 = 2.13;
const const2 = 333; // 报错同let:Identifier 'const2' has already been declared

const不可以重赋值


const const3 = 22;
const3 = 4; //报错:Assignment to constant variable.


总结:

  1. var 声明变量属于函数作用域,let/const为块级作用域
  2. var存在变量提升现象,而let/const不会提升
  3. var变量可以重复声明,而同一个块级作用域中let不可重复声明,const只能定义一次值
  4. 定义意思是开辟内存空间并且有值,声明意思是只开辟空间

最后

以上就是虚心墨镜为你收集整理的var/let/const最佳实践讲解的全部内容,希望文章能够帮你解决var/let/const最佳实践讲解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部