前端小菜鸡一枚,分享的文章纯属个人见解,若有不正确或可待讨论点可随意评论,与各位同学一起学习~
a = 1;
var a;
console.log(a); // 1
var tmp = new Date();
function fn(){
console.log(tmp);
if(false){
var tmp = 'hello world';
}
}
fn(); // undefined
/**
* 在这个函数中,原本是要打印出外层的tmp变量,但是因为变量提升的问题,
* 内层定义的tmp被提到函数内部的最顶部,相当于覆盖了外层的tmp,所以打印结果为undefined。
*/
for (var i = 0; i < 3; i++){
setTimeout(() => {
console.log(i);
}, 2000);
} // 3 3 3
for (let i = 0; i < 3; i++){
setTimeout(() => {
console.log(i);
}, 2000);
} // 0 1 2
/**
* 由于遍历时定义的i会变量提升成为一个全局变量,在函数结束之后不会被销毁,
* 所以,一直修改的是之前的定义的全局变量,所以第一个输出三次 3, 第二个输出 0 1 2。
*/
/**
* 在 for 循环中,let 声明的变量会存在一个块级作用域的概念,使用 let 声明的迭代变量时,
* js 引擎会在后台为每一个迭代循环声明一个新的迭代变量,因此每次使用的 i 都是不同的。
*/
•问题标注 Q:(question)
•答案标注 R:(result)
•注意事项标准:A:(attention matters)
•详情描述标注:D:(detail info)
•总结标注:S:(summary)
•分析标注:Ana:(analysis)
•提示标注:T:(tips)