推荐的最佳实践
- 驼峰命名
- 在语句后添加分号;
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, bfor (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

