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
8console.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
9console.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
5let letDemo = 10; let letDemo = 13; //抛出语法错误:'letDemo' has already been declared console.log(letDemo);
3. 内层for循环定义
var for循环内层定义:每次回调相同的值:
复制代码
1
2
3
4
5
6
7
8const 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
8const 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
4const const1; //报错:Missing initializer in const declaration
const 不可以重定义
复制代码
1
2
3
4const const2 = 2.13; const const2 = 333; // 报错同let:Identifier 'const2' has already been declared
const不可以重赋值
复制代码
1
2
3
4const const3 = 22; const3 = 4; //报错:Assignment to constant variable.
总结:
- var 声明变量属于函数作用域,let/const为块级作用域
- var存在变量提升现象,而let/const不会提升
- var变量可以重复声明,而同一个块级作用域中let不可重复声明,const只能定义一次值
- 定义意思是开辟内存空间并且有值,声明意思是只开辟空间
最后
以上就是虚心墨镜最近收集整理的关于var/let/const最佳实践讲解的全部内容,更多相关var/let/const最佳实践讲解内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复