1、var声明及变量提升机制
无论在哪里声明,都会被当成在当前作用域顶部声明的变量,这就是我们常说的提升机制。
function getValue(params) {
if (params) {
var value = 'blue'
//代码
return
} else {
return null
}
console.log(value) //undefined
}
这时你可能params的值为true时,才会创建value值。事实上,无论如何变量value都会被创建。在预编译阶段,js引擎会把上面的getValue函数修改成下面这样:
function getValue(params) {
var value
if (params) {
value = 'blue'
//代码
return
} else {
return null
}
console.log(value) //undefined
}
2、const和let块级作用域
块级作用域存在于:
- 函数内部
- 块中(字符{和}之间的区域)
let声明的用法和var相同。用let代替var来声明变量,就可以把变量的作用域限制在当前代码块中。由于let声明不会被提升,因此开发者通常将let声明语句放在封闭代码块的顶部,以便整个代码块都可以访问。
function getValue(params) {
if (params) {
let value = 'blue'
//代码
return
} else {
//变量value在此处不存在
return null
}
// 变量value在此处不存在
}
const声明的是常量,其值一旦被设定后就不可更改。
最佳实践:默认使用const,只在确实需要改变变量的值时使用let。这样就可以在某种程度上实现代码的不可变,从而防止错误的产生。