一、var声明与变量提升
使用var关键字声明的变量,无论其实际声明位置在何处,都会被视为声明于所在函数的顶 部(如果声明不在任意函数内,则视为在全局作用域的顶部)
let 声明的语法与 var 的语法一致,但会将变量的作用域限制在当前代码块中。上代码
// var变量提升
if(false){
var value = 40
}
console.log(value) // undefined
// 上面的代码经过JS引擎在后台的调整,实际上像这样
// var value
// if(false){
// value = 40
// }
// console.log(value)
if(false){
let value2 = 40
}
console.log(value2) // 报错value2 is not defined
使用 const 声明的变量会被认为是常量,并且与 let 声明一样,都是块级声明。
// 有效的常量
const maxItems = 30
// 语法错误:未进行初始化
const name
if(condition){
const max = 5
}
// max 在此处无法访问
基本的懂了来点复杂的
var funcs = [];
for (var i = 0; i < 10; i++) {
funcs.push(function() {
console.log(i);
});
}
funcs.forEach(function(func){
func() // 输出数值"10"十次
})
// 如果吧for循环中var变成let
var funcs = [];
for (let i = 0; i < 10; i++) {
funcs.push(function() {
console.log(i);
});
}
funcs.forEach(function(func){
func() // 输出数值从0到9依次输出
})
需要重点了解的是: let 声明在循环内部的行为是在规范中特别定义的,而与不提升变 量声明的特征没有必然联系。事实上,在早期 let 的实现中并没有这种行为,它是后来 才添加的。
总结
以上的内容是通过阅读深入理解ES6摘出来的。