翼度科技»论坛 编程开发 JavaScript 查看内容

5 JavaScript变量提升

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
5 变量提升

看以下代码, 或多或少会有些问题的.
  1. function fn(){
  2.     console.log(name);
  3.     var name = '大马猴';
  4. }
  5. fn()
复制代码
发现问题了么. 这么写代码, 在其他语言里. 绝对是不允许的. 但是在js里. 不但允许, 还能执行. 为什么呢?  因为在js执行的时候. 它会首先检测你的代码.  发现在代码中会有name使用. OK. 运行时就会变成这样的逻辑:
  1. function fn(){
  2.     var name;
  3.     console.log(name);
  4.     name = '大马猴';
  5. }
  6. fn()
复制代码
看到了么. 实际运行的时候和我们写代码的顺序可能会不一样....这种把变量提前到代码块第一部分运行的逻辑被称为变量提升. 这在其他语言里是绝对没有的. 并且也不是什么好事情. 正常的逻辑不应该是这样的. 那么怎么办?  在新的ES6中. 就明确了, 这样使用变量是不完善的. es6提出. 用let来声明变量. 就不会出现该问题了.
  1. function fn(){
  2.     console.log(name);  // 直接报错, let变量不可以变量提升.
  3.     let name = '大马猴';
  4. }
  5. fn()
复制代码
结论一, 用let声明变量是新版本javascript提倡的一种声明变量的方案.
let还有哪些作用呢?
  1. function fn(){
  2.     // console.log(name);  // 直接报错, let变量不可以变量提升.
  3.     // let name = '大马猴';
  4.     var name = "JAY";
  5.     var name = "WLH"
  6.         /*注意, 报错是发生在代码检查阶段. 所以. 上述代码根本就执行不了.
  7. ==结论二, 在同一个作用域内. let声明的变量只能声明一次. 其他使用上和var没有差别=="; */
  8.     console.log(name);
  9. }
  10. fn()
复制代码
显然一个变量被声明了两次. 这样也是不合理的. var本意是声明变量. 同一个东西. 被声明两次. 所以ES6规定. let声明的变量. 在同一个作用域内. 只能声明一次.
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>变量提升</title>
  6. </head>
  7. <body>
  8.    
  9. </body>
  10. </html>
复制代码
  1. // // 变量提升
  2. // function fn() {
  3. //     console.log(name);
  4. //     var name = '大马猴';
  5. // }
  6. // fn();
  7. //
  8. // function fn() {
  9. //     var name;
  10. //     console.log(name);
  11. //     name = '大马猴';
  12. // }
  13. // fn();
  14. // // let 声明变量可以避免变量提升问题
  15. // function gn() {
  16. //     console.log(name);  // 直接报错, let变量不可以变量提升.
  17. //     let name = '大马猴';
  18. // }
  19. // gn();
  20. // function sn() {
  21. //     var name = 'jay';
  22. //     var name = 'wlh';
  23. //     console.log(name);
  24. // }   // 一个变量被声明了两次. 这样也是不合理的
  25. // sn();   // wlh
  26. // // 在同一个作用域内. let声明的变量只能声明一次. 其他使用上和var没有差别
  27. // function xn() {
  28. //     let name = 'jay';
  29. //     console.log(name);
  30. //     let name = 'wlh';
  31. //     console.log(name);
  32. // }
  33. // xn();   // 报错是发生在代码检查阶段. 所以. 上述代码根本就执行不了
复制代码
来源:https://www.cnblogs.com/zczhaod/p/17639686.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具