this 代表上下文,

  1. 在哪调用的函数,this就指向哪里,
  2. 箭头函数指向 调用者的父函数,
  3. 严格模式和非严格模式
  • 全局变量/局部变量
  • 显示声明/隐士声明
  • 变量提升
  • 作用域

这几个指标是相互关联的,

作用域

在es5的时候
全局作用域 === 函数作用域;

像 if,for,while swich 等循环判断的代码块,是没有自己的作用域的
在for(var i;) 其中的 i 会进行变量的提升 到全局作用域

在es6 加入了 let 关键字, 块状作用域 可以在代码块中声明自己的作用域;

引出一个问题 在函数作用域/块状作用域中没有显示声明的变量 是什么形式的 var/let

函数作用域内 使用的 var 块作用域使用 let 来隐士的声明变量;

  1. 代码分析
  2. // 外部变量使用let来声明
  3. let a = 0
  4. if(true){
  5. console.log("内部",a) a(){}
  6. a = 1;
  7. console.log("内部",a) 1
  8. function a(){};
  9. a = 21;
  10. console.log("内部",a) 21
  11. }
  12. console.log("外部",a) 0
  13. //外部使用var 来声明变量
  14. var a = 0
  15. if(true){
  16. console.log("内部",a) a(){}
  17. a = 1;
  18. console.log("内部",a)
  19. function a(){};
  20. a = 21;
  21. console.log("内部",a)
  22. }
  23. console.log("外部",a)