JavaScript-高级篇,闭包的理解

71 阅读2分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。

闭包

1. 变量的作用域

变量根据作用域的不同分为两种:全局变量和局部变量。  

  1. 函数内部可以使用全局变量。

  2. 函数外部不可以使用局部变量。

  3. 当函数执行完毕,本作用域内的局部变量会销毁。

注意:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

思考:如何从外部读取函数内部的局部变量?

出于种种原因,我们有时候需要获取到函数内部的局部变量。但是,上面已经说过了,正常情况下,这是办不到的!只有通过变通的方法才能实现,那就是在函数内部,再定义一个函数。  

2. 什么是闭包

函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。

闭包的作用

作用:延伸变量的作用范围。

function fn() {

   var num = 10;

   function fun() {

       console.log(num);

   }

    return fun;

 }

var f = fn();

f();

总结:

  • 闭包有三个特性:
  1. 函数嵌套函数

  2. 函数内部可以引用外部的参数和变量

  3. 可以使函数中的变量可以长期驻扎在内存

  • 使用闭包的好处

  1.希望一个变量长期驻扎在内存中

  2.避免全局变量的污染(多人定义同样名字的全部变量冲突)

  • 使用闭包的坏处:

内存泄漏(应用程序不再用到的内存,由于某些原因,没有及时释放,就叫做内存泄漏。)

4. 闭包的案例

利用闭包的方式得到当前li 的索引号

for (var i = 0; i < lis.length; i++) {

// 利用for循环创建了4个立即执行函数

// 立即执行函数也成为小闭包因为立即执行函数里面的任何一个函数都可以使用它的i这变量

(function(i) {

    lis[i].onclick = function() {

      console.log(i);

    }

 })(i);

}