1.let 以及 const
- 1.1 JS中只有函数作用域,而没有块级作用域
var s = 1; var another = function() { var s = 2}; another(); console.log(s); //输出 1复制代码
这是var定义的函数作用域,函数作用域内赋值,不影响外面s的值
var s = 1; if(true) { var s = 2;}; console.log(s); //输出2复制代码
这是var定义的块级作用域,块级作用域中用var定义的变量赋值会影响外面的值
- let和const就是为了解决var作用域的问题产生块级作用域
function f1() { let n = 5; if (true) { let n = 10; } console.log(n); // 5}f1()复制代码
通过babel编译后
function f1() { var n = 5; if (true) { var _n = 10; //不是n,是_n } console.log(n); // 5 }f1();复制代码
babel发现里面的变量名和外面的变量名相同,就把变量名换一下 各个引擎有不一样的做法,例如node环境(直接用node命令启动)不依赖babel,node是V8引擎。
let t = 2; if(true) { let t = 1 }; console.log(t);复制代码
babel编译后
var t = 2;if (true) { var _t = 1;};console.log(t);复制代码
- 1.2 const(常量)
const C= 'C'; // readonly C = 'D'; // SyntaxError: src/ES6/let_const.js: "C" is read-only复制代码
定义一个只读常量(定义时需赋值)
const c= { // point to a reference 堆栈存储 指针 a:1}c={a: 2}; // point to another reference(指针变了)c.a = 2; // c的reference并没有变 可以 (指针没变)复制代码
定义一个只读对象(堆中存储),指针只读,值可变