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


var/let作用域区别:



1. 全局作用域访问不同

var可以被顶级window访问

复制代码
1
2
3
4
5
6
7
<script> var a = 12; function f() {}; console.log(window.a); // 12 console.log(window.f); // f(){} </script>

let/const不可被顶级window访问

复制代码
1
2
3
4
5
6
7
8
9
<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块级作用域:

复制代码
1
2
3
4
5
6
7
8
9
10
<script type="text/javascript"> let a2 = 10; const b2 = 20; // 解析后相当于如下: (function() { var a2 = 10; var b2 = 20; }) </script>

2. 函数作用域相同

var 在函数作用域定义报defined

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
<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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
<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定义:会将声明提到最前面

复制代码
1
2
3
4
5
6
7
8
console.log(varDemo1); // 输出: undefined if (true) { var varDemo1 = "this is var " console.log(varDemo1); // 输出:this is var } console.log(varDemo1); // 输出:this is var

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

复制代码
1
2
3
4
5
6
7
8
9
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 重定义如同重新赋值

复制代码
1
2
3
4
5
6
// 重定义: var varDemo = 10; var varDemo = 13; console.log(varDemo); // 输出:13

let 重定义报错

复制代码
1
2
3
4
5
let letDemo = 10; let letDemo = 13; //抛出语法错误:'letDemo' has already been declared console.log(letDemo);

3. 内层for循环定义

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

复制代码
1
2
3
4
5
6
7
8
const things = 0 for (var i = 3; i > things; i--) { setTimeout(function() { console.log(i); //输出:0 0 0 }, 1000) }

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

复制代码
1
2
3
4
5
6
7
8
const thingLet = 0; for (let i = 3; i > thingLet; i--) { setTimeout(function() { console.log(i); // 输出:3 2 1 }, 1000) }

4. let存在暂时性死区

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

复制代码
1
2
3
4
5
6
7
8
<script type="text/javascript"> var value = 111; if (true) { value = "abc"; // 报错: value is not defined let value; } </script>





var/let混合使用

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

复制代码
1
2
3
4
5
<script type="text/javascript"> var ab = 1; let ab = 1; // 报错:dentifier 'ab' has already been declared </script>

函数内定义

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

复制代码
1
2
3
4
5
6
7
8
9
<script type="text/javascript"> let aa = "2" function abc() { var aa = 23 } console.log(aa); // 输出:2 console.log(abc); </script>





特殊的const常量


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

const 不可以声明,只能定义

复制代码
1
2
3
4
const const1; //报错:Missing initializer in const declaration

const 不可以重定义

复制代码
1
2
3
4
const const2 = 2.13; const const2 = 333; // 报错同let:Identifier 'const2' has already been declared

const不可以重赋值

复制代码
1
2
3
4
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最佳实践讲解内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部