推荐的最佳实践
- 驼峰命名
- 在语句后添加分号;
if语句加{}使用
if(test){
console.log('输出')
}
-
关键字和保留字
var、let、const
var
声明作用域 —- 函数 ,全局两种
- var有声明提升
let
- 作用域 —- 块级 {}
- 暂时性死区 —- 因为不会提升变量到最上面,提前就使用了,导致报错。(相当于人还没来就叫了它的名字)
- 全局声明也不会变成全局变量 —- 但是也要保证同一个页面不能有两个相同变量名
条件声明 —- var会提升,let不能提升,所以在条件语句中声明会导致声明失败(我不确定这个人来没来,所以就不去叫这个人的名字)
<script>
// 假设脚本不确定页面中是否已经声明了同名变量
// 那它可以假设还没有声明过
if (typeof name === 'undefined') {
let name;
}
// name 被限制在 if {} 块的作用域内
// 因此这个赋值形同全局赋值
name = 'Matt';
try {
console.log(age); // 如果 age 没有声明过,则会报错
}
catch(error) {
let age;
}
// age 被限制在 catch {}块的作用域内
// 因此这个赋值形同全局赋值
age = 26;
</script>
cosnt
与let其他一致
唯一不同在于,const是引用地址的定义
let i = 0;
for (const j = 7; i < 5; ++i) {
console.log(j);
}
// 7, 7, 7, 7, 7
/* 在for-in 和 for-of 循环中使用const */
for (const key in {a: 1, b: 2}) {
console.log(key);
}
// a, b
for (const value of [1,2,3,4,5]) {
console.log(value);
}
// 1, 2, 3, 4, 5
练习题
答:
输出hi。因为message没有使用任何标识符生命,所以会自动挂载到window上。window.message也是一样的结果。
- 输出Matt 和 undefined。因为用var声明的变量是全局变量,会挂载到window上的全局变量。let声明也是全局但是只是为了用于记录,不可以重复声明,也不会挂载到window上面。
- 输出 5 5 5 5 5。因为var是全局变量,不会形成闭包。定时器的执行是在for循环全部结束之后,这个时候的i,就是全局变量的5了。如果用let声明的话,闭包会记住每一个块在执行时的函数,会记录下每一次的变量,会输出0 1 2 3 4