Javascript闭包

76 阅读1分钟

1.基本概念

闭包指有权访问另一个函数作用域中变量的函数

1.作用域

1.某一个函数体内的变量:

局部变量(函数外部无法访问,函数内部可以访问):使用var、let、const修饰的变量,在函数开始时会创建局部变量,在函数完成时会删除它们。

全局变量(函数外部可以访问):不使用关键字修饰

<script type="text/javascript">
  //在函数外使用var关键字声明变量test_var1
  var test_var1 = "变量1";
  //定义函数testFun
  function testFun() {
    //在函数中定义变量没加任何关键字的变量test_var2
    test_var2 = "变量2";
    //函数内使用var关键字定义的test_var3
    var test_var3 = "变量3";
  }
  //函数执行
  testFun();
  alert(test_var1 + "\n" + test_var2); //执行
  alert(test_var3); //不执行
</script>
<script type="text/javascript">
  //定义函数testFun
  function testFun() {
    //函数内使用var关键字声明变量test_var
    var test_var1 = "1";
    //if代码块
    if (test_var1 == "1") {
      //定义变量test_var2
      var test_var2 = 10;
      //for代码块
      for (var i = 0; i < 5; i++) {
        //打印输出i
        document.write(i);
      }
    }
    //在if块外访问test_var2
    alert(test_var2); //正常输出
    //在循环体外访问i
    alert(i);  //输出上面的i为5,因为var定义的i的作用域是整个函数
  }
  //函数执行
  testFun();
</script>

如果上述的i是以let声明,则下面的alert(i)会输出undefined

<script type="text/javascript"> 
    //循环体 
    for(let v = 0;v < 5;v++){ 
        //在循环体内输出v 
        console.log(v); 
     } 
     //在循环体外输出v 
     console.log(v);  //输出unidenfied
</script>

可以看到在循环体外不能访问循环体内定义的变量。

2.某一个函数体外的变量:

全局变量(该函数内部也可以访问):在 HTML 中,全局作用域是 window。所有全局变量均属于 window 对象。全局变量(或函数)能够覆盖 window 变量(或函数),任何函数,包括 window 对象,能够覆盖您的全局变量和函数,所以尽量不要创建全局变量。

局部变量(该函数内部不可以进行访问):函数外var修饰的

<script type="text/javascript">
  //在函数外使用var关键字声明变量test_var
  var test_var = "函数外的test_var";
  //定义函数testFun
  function testFun() {
    //打印输出test_var
    document.writeln(test_var + "<br>"); //输出undefined
    //函数内使用var关键字定义的test_var
    var test_var = "函数内的test_var";
    //再次打印输出test_var
    document.writeln(test_var + "<br>"); //输出函数内的test_var
  }
  //函数执行
  testFun();
</script>

document.writeln(test_var + "<br>");输出undefined是因为变量提升机制

下面的var test_var = "函数内的test_var";会导致上面产生一个var test_var ,所以最终输出undefined

用let来避免变量提升机制

2.执行上下文

juejin.cn/post/684490… juejin.cn/post/708821…

执行上下文 看作是当前代码执行的一个环境与作用域。换句话说,当我们启动程序时,我们从全局执行上下文中开始。一些变量是在全局执行上下文中声明的。我们称之为全局变量。