函数作用域:函数内的变量不能在函数外调用

  1. <script>
  2. function fn(){
  3. var num = 3;
  4. }
  5. console.log(num); // 显示未定义
  6. //es6以后,用var定义num不会形成块级作用域
  7. //块作用域
  8. {
  9. var num = 4;
  10. let n = 5;
  11. }
  12. console.log(num); //4
  13. console.log(n); //未定义
  14. </script>

不是块级作用域 - 全局

  1. <script>
  2. for(var i=0;i<10;i++){
  3. }
  4. console.log(i) //10
  5. for(;i<20;i++){
  6. console.log(i) //[10到20]
  7. }
  8. </script>

使用let之后 - 变成了块级作用域

  1. <script>
  2. for(var i=0;i<10;i++){
  3. }
  4. console.log(i) //未定义
  5. </script>

2、var let const 区别

  1. 全局作用域: {}外面的作用域,是全局作用域
  2. 块级作用域: 只要{ }没有和函数结合在一起,就是块级作用域
  3. 局部作用域(函数作用域): 函数后面的{}中的作用域

2-1 var 声明作用域

  1. 关键的问题在于,使用 var 操作符定义的变量会成为包含它的函数的局部变量
  1. function test() {
  2. var message = "hi"; // 局部变量
  3. }
  4. test();
  5. console.log(message); // 出错
  6. // 在函数内定义变量时省 略 var 操作符,可以创建一个全局变量
  7. function test() {
  8. message = "hi"; // 全局变量
  9. }
  10. test();
  11. console.log(message); // "hi"

2-1-1 var 声明提升

  1. 使用这个关键字声明的变量会自动提升到函数作用域 顶部:
  2. function foo() {
  3. console.log(age);
  4. var age = 26;
  5. }
  6. foo(); // undefined 但不会报错

2-2 let 声明

  1. let 跟 var 的作用差不多,但有着非常重要的区别。
  2. 明显的区别是,let 声明的范围是块作用域, 而 var 声明的范围是函数作用域。

1. 暂时性死区

  1. let 与 var 的另一个重要的区别,就是 let 声明的变量不会在作用域中被提升。

2. 全局声明

  1. 与 var 关键字不同,使用 let 在全局作用域中声明的变量不会成为 window 对象的属性(var 声明的变量则会)

3.条件声明

  1. var 存在变量提升 let没有
  2. var 可以重复声明 let不可以

4. for 循环中的 let 声明

  1. 迭代变量的作用域仅限于 for 循环块内部:
  2. for (let i = 0; i < 5; ++i) {
  3. // 循环逻辑
  4. }
  5. console.log(i); // i 没有定义

2-3 const 声明

  1. const 的行为与 let 基本相同,
  2. 唯一一个重要的区别是
  3. 用它声明变量时必须同时初始化变量
  4. 且尝试修改 const 声明的变量会导致运行时错误

3、闭包

指子函数可以访问外部作用域变量的函数特性,即使在子函数作用域外也开可以访问;
如果没有闭包那么处理事件绑定,异步请求时都会变困难;

  • js中所有的函数都是闭包
  • 闭包一般在子函数本身作用域外执行,即延伸作用域