概述
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.
总结:
- var 声明变量属于函数作用域,let/const为块级作用域
- var存在变量提升现象,而let/const不会提升
- var变量可以重复声明,而同一个块级作用域中let不可重复声明,const只能定义一次值
- 定义意思是开辟内存空间并且有值,声明意思是只开辟空间
最后
以上就是虚心墨镜为你收集整理的var/let/const最佳实践讲解的全部内容,希望文章能够帮你解决var/let/const最佳实践讲解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复