var、let、块级作用域
- 事实上,var的设计可以看成JavaScript语言设计上的错误,但是这种错误多半不能修复和移除,因为要向后兼容
- 大概10年前,Bredan Eich就修复了这个问题,他新添加了一个新的关键字:let
- 我们可以将let看成完美的var
- 块级作用域
- 变量作用域:变量在哪个范围内可用
- var 没有块级作用域的,{ } 中生命的变量在外部也可以使用,因此他会引起一些问题
- 外部可以修改{ }中定义的变量
- for() 循环中的问题 ```javascript var btns = document.getElementByTagName(‘button’);
// 这种做法,点击每个按钮弹出来的都是’第5个按钮被点击’ for (var i=0; i<btn.length; i++) { btn[i].onClick = function () { console.log(‘第’ + i + ‘个按钮被点击’); } }
// 我们之前解决这种问题的方法,就是强行加一个闭包,把每个i都用闭包存起来 for (var i=0 ;i<btns.length; i++) { (function (i) { btns[i].onClick = function () { console.log(‘第’ + i + ‘个按钮被点击’); } })(i) }
> 问题:为什么闭包可以解决这个问题?- 因为函数内部是块级作用域,传进来的值不会被外部改掉,而之前 { } 中的值是可以被外部修改的!- 总结:ES6之前因为 if 和 for 都没有块级作用域的概念,所以在很多时候,我们都必须借助于 function 的作用域来解决引用外部变量的问题。但是在ES6中加入了 let ,主要就是加入了 if 和 for 的块级作用域 ,它们中的内容是不能被外部获取和修改的~ 此时上面的例子,只需要把var改为let就可以和后面闭包那样解决问题<a name="5KA0E"></a>## const- const关键字在很多语言中都是存在的,比如C/C++中,主要的作用就是将某个变量修饰为常量。在JavaScript中也是如此,使用const修饰的标识符为常量,不可以再次赋值- 什么时候使用const呢?- 当我们修饰的标识符不会被再次赋值时,就可以使用const来保证数据的安全性- 在开发中**优先使用const**,只有在需要修改某一个标识符时才用let (swift let/var)- 注意几点:- 使用了const的标识符,不能进行赋值操作- 使用了const的标识符,必须给赋初始值- 常量的含义是指向的对象不能修改,但是可以修改对象的属性(栈中的地址不能改,但是该地址指向的对象是在堆中的,可以改)<a name="552xS"></a>## 对象字面量的增强写法- 常规写法```javascriptconst obj1 = {name: 'ryan',age: '23',run: function () {console.log('running');}eat: function () {console.log('eating');}}
- ES6属性的增强写法 ```javascript const name = ‘ryan’; const age = 23; const height = 175;
// ES5写法 const obj1 = { name: name, age: age, height: height }
// ES6写法 const obj2 = { name, age, height }
- ES6函数的增强写法```javascript// ES5写法const obj1 = {run: function () {~~~},eat: function () {~~~}}// ES6增强写法const obj2 = {run () {~~~},eat () {~~~}}
- TypeScript
- Flow
