电商网站开发意义,网站安全和信息化建设,百度搜不倒公司网站,迷你世界怎么做网站期1.let/const和var的区别
1.变量提升#xff1a;var会发生变量提升#xff0c;let和const不存在变量提升
2.暂时性死区#xff1a;变量声明之前变量不可用称为暂时性死区。var不存在#xff0c;let和const存在暂时性死区
3.typeof 不再是百分百不会报错#xff1a;let声…1.let/const和var的区别
1.变量提升var会发生变量提升let和const不存在变量提升
2.暂时性死区变量声明之前变量不可用称为暂时性死区。var不存在let和const存在暂时性死区
3.typeof 不再是百分百不会报错let声明前不能使用typeof typeof x; // Uncaught ReferenceError: Cannot access x before initializationlet x;
4.不允许重复声明var重复声明会覆盖前一个let和const不允许重复声明用var声明过的也不允许let和const声明
5.函数内部var声明过的也不允许let和const声明有形参后不能再使用let声明
// 函数内部
function get(){var b 1;let b 6;
}function get(b){let b
}
2.块级作用域
1. 为什么要有块级作用域?
ES5 只有全局作用域和函数作用域没有块级作用域这带来很多不合理的场景
第一种场景内层变量可能会覆盖外层变量。
var tmp new Date();
function f() {
console.log(tmp);if (false) {var tmp hello world;}}
f(); // undefined
第二种场景用来计数的循环变量泄露为全局变量for (var i 0; i s.length; i)
2. 特点允许块级作用域的任意嵌套里面可以访问外面的外面不可以访问里面的
每一层都是一个单独的作用域。每一层中的数据是不互通的。里面可以访问外面的外面不可以访问里面的
{{let a 123;}console.log(a) // 報錯
}// 里面可以访问外层的a
{{let a 123;{console.log(a)}}}
3. 对比es5之前的代码块需要使用匿名函数进行嵌套 let a 全局;{let a 局部console.log(a);}console.log(a);var aa 全局;(function(){var aa 局部console.log(aa);})()console.log(aa);
3.const特殊的地方
1. const声明一个只读的常量。一旦声明常量的值就不能改变
2. const声明的变量不得改变值这意味着const一旦声明变量就必须立即初始化不能留到以后赋值
3.内存地址不变 里面的东西可以边
const foo {};
// 为 foo 添加一个属性可以成功foo.prop 123;
foo.prop // 123
// 将 foo 指向另一个对象就会报错
foo {}; // TypeError: foo is read-only
4.如果真的想将对象冻结应该使用Object.freeze方法。const不能真正冻结对象
常量foo指向一个冻结的对象所以添加新属性不起作用严格模式时还会报错。
const foo Object.freeze({});
// 常规模式时下面一行不起作用// 严格模式时该行会报错
foo.prop 123;
use strict;
const foo Object.freeze({});
foo.prop 123; // 報錯
5.for循环内使用let变量。
for循环还有一个特别之处就是设置循环变量的那部分是一个父作用域而循环体内部是一个单独的子作用域。
这种for循环和循环体内使用的是用一个变量所以最后输出的是6
var a [];
for (let i 0; i 10; i) {a[i] function () {console.log(i);};}
a[6](); // 6
以下这种for循环和循环体内都由单独的作用域变量所以每次输出的都是自己作用域的变量‘abc’
for (let i 0; i 3; i) {let i abc;console.log(i);
}
// abc// abc// abc