<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>let用途</title> <script src="../../../vendor/traceur.js"></script> <script src="../../../vendor/bootstrap.js"></script> <script type="text/traceur"> /*ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 let不像var那样,会发生“变量提升”现象。 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。 let不允许在相同作用域内,重复声明同一个变量。 */ var a = 100; let b = 200; console.log(a); //100 console.log(b); //200 { var a = 100; let b = 200;//大括号作用范围,不是函数作用域, } console.log(a); //100 console.log(b); //b is not defined -- Error ------------------------------------------------------------------- { var a = 100; let b = 200;//大括号作用范围,不是函数作用域, var d = b; var e = a;//语句已经执行了,进行了值传递,后面变量销毁和重新赋值不影响 } a = 300; console.log(a); //300 console.log(d); //200 console.log(e); //100 //console.log(b); //b is not defined -- Error for (let j = 0; j < 3; j++) { console.log(j);//0,1,2 }; public static void main (String[] args) throws java.lang.Exception { int a = 3; { int b = a; a = 5; System.out.println(b);//3 } } var a = 1; var a = 2; console.log(a);//2 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>let不存在变量提升</title> <script src="../../../vendor/traceur.js"></script> <script src="../../../vendor/bootstrap.js"></script> <script type="text/traceur"> //ES5 console.log("ES5:"); var a = []; for (var i = 0; i < 10; i++) { var c = i; a[i] = function () { console.log(c);//基本变量是值传递,只有这行语句执行的时候,才会使用到c的值,此时c已经变成了9 }; console.log(a[i]); }; a[5](); //9 //ES6 console.log("ES6:"); var b = []; for (var j = 0; j < 10; j++) { let d = j;//每次都声明一个新的变量d,var不是,每次都是用之前声明的变量c,语句执行之前不会进行预加载, b[j] = function () { console.log(d);//这行语句执行的时候,使用的是d的值,而每一个d都是一个新的d值不一样 }; }; b[5](); //5 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>let暂时性死区</title> <script src="../../../vendor/traceur.js"></script> <script src="../../../vendor/bootstrap.js"></script> <script type="text/traceur"> { console.log(a); //undefined 语句执行之前不会进行预加载, let a = 100; } { let a = 100; console.log(a); //100 } ------------------------------------------------------- var a = 200; { console.log(a); //undefined,不能用外部的a了,大括号里面都是let的a, let a = 100; //从声明的地方开始才能使用变量a console.log(a); //100,不受外部影响。 } { var a = 100; var a = 200; console.log(a); } // 报错 { var b = 100; let b = 200; console.log(b); } // 报错 { let c = 100; var c = 200; console.log(c); } // 报错 { let d = 100; let d = 200; console.log(d); } // 模块之间不影响,可以重复声明 { var a = 100; var a = 200; console.log(a); } { let a = 300; console.log(a); } // 模块内部不允许用let命令重复声明 { var a = 1; let a = 2; } </script> </head> <body> </body> </html>
let只在大括号内有效,并且优先级高于var。