一.为什么需要块级作用域:
1.es5中只有全局作用域和块级作用域,内层变量可能会覆盖外层变量
var time=new Date();//全局变量 function fun(){ console.log(time); if(false){ var time="hello world"; }; }; fun();//undefined
没有输出new Date();因为在调用函数时,输出time,time为全局值,由于在函数里面有var函数内部的time会覆盖外面的time的地址,找不到time的地址,所以就不能找到time的值
2.用来计数的循环变量泄露为全局变量
var string="hello world"; for(var i=0;i<string.length;i++){ console.log(string[i]); }; console.log("循环结束"); console(i);//12(i跳出了循环体)
二.es6的块级作用域
let、const为javascript新增了块级作用域。
//es5 console.log("es5:"); function fun(){ var num=100; if(true){ var num=200; } consloe.log(num); } fun();//200; //es6 console.log("es6:"); function fun(){ let num=100; if(true){ let num=200; } consloe.log(num); } fun();//100;
es5中的var结果为200因为内层变量影响到了外层变量,所以200覆盖100,es6中,内部不会影响外部,为两个相对独立的作用域
//es5---------------------------- function fun(){ console.log("i love you"); } (function (){ if(false){ function fun(){ console.log("i love him"); }; }; fun();//i love you }());//立即执行函数,不管判断会先执行,后面的会覆盖外面的fun()的 //es6:--------------------------- function fun(){ console.log("i love him"); } { if(false){ function fun(){ console.log("i love you"); }; }; fun();//i love him(内部模块不会影响外部模块) };
在let和const中,有限使用const,