var a = 1; function f1(){ console.log(a); //如果不注释,内部变量会覆盖外层变量,输出为undefined // if(false){ // var a = 2; // } } f1(); let b=1; function f2(){ console.log(b); //因为let,块级作用域,不影响外面的b if(false){ let b=2; } } f2(); for(var i=0;i<5;i++){ console.log(i); } //输出为5,这时候i变成全局变量了 console.log(i); //es5使用闭包实现块级作用域 for(var i=0;i<5;i++){ //不使用闭包,全部都是5 setTimeout(() => { console.log(i) }, 0) //使用闭包,输出正确 ;(function (index){ console.log(index); })(i); }