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) }

  1. > 问题:为什么闭包可以解决这个问题?
  2. - 因为函数内部是块级作用域,传进来的值不会被外部改掉,而之前 { } 中的值是可以被外部修改的!
  3. - 总结:ES6之前因为 if for 都没有块级作用域的概念,所以在很多时候,我们都必须借助于 function 的作用域来解决引用外部变量的问题。但是在ES6中加入了 let ,主要就是加入了 if for 的块级作用域 ,它们中的内容是不能被外部获取和修改的~ 此时上面的例子,只需要把var改为let就可以和后面闭包那样解决问题
  4. <a name="5KA0E"></a>
  5. ## const
  6. - const关键字在很多语言中都是存在的,比如C/C++中,主要的作用就是将某个变量修饰为常量。在JavaScript中也是如此,使用const修饰的标识符为常量,不可以再次赋值
  7. - 什么时候使用const呢?
  8. - 当我们修饰的标识符不会被再次赋值时,就可以使用const来保证数据的安全性
  9. - 在开发中**优先使用const**,只有在需要修改某一个标识符时才用let swift let/var
  10. - 注意几点:
  11. - 使用了const的标识符,不能进行赋值操作
  12. - 使用了const的标识符,必须给赋初始值
  13. - 常量的含义是指向的对象不能修改,但是可以修改对象的属性(栈中的地址不能改,但是该地址指向的对象是在堆中的,可以改)
  14. <a name="552xS"></a>
  15. ## 对象字面量的增强写法
  16. - 常规写法
  17. ```javascript
  18. const obj1 = {
  19. name: 'ryan',
  20. age: '23',
  21. run: function () {
  22. console.log('running');
  23. }
  24. eat: function () {
  25. console.log('eating');
  26. }
  27. }
  • 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 }

  1. - ES6函数的增强写法
  2. ```javascript
  3. // ES5写法
  4. const obj1 = {
  5. run: function () {~~~},
  6. eat: function () {~~~}
  7. }
  8. // ES6增强写法
  9. const obj2 = {
  10. run () {~~~},
  11. eat () {~~~}
  12. }
  • TypeScript
  • Flow