js闭包

开头简述

学了JavaScript函数的作用域我们可以清楚的知道,在函数内部可以访问与其同属一个作用域链的外部函数的变量,以及可以访问全局变量。那么,我们如何从函数外部来访问函数内部中的变量呢?显然,常规办法无法实现。那么就引入了闭包这个概念。闭包可以实现从函数外部来访问函数内部中的变量。

js闭包详解

本篇对js闭包的理解要从一个详细的例子开始,如下所示:

function add(){
  var count = 100;

  function displayAlert(){//闭包
    count ++;
    alert(count);
  }

  return displayAlert;
}

var s = add();
s();
s();
//执行结果是依次提示101和102

//防止内存泄露
s = null;

闭包的概念

所谓闭包,就是在函数内部定义一个函数,通俗的来讲也就是函数内部的函数。也就是上面代码块中所指的函数displayAlert。

闭包的原理

闭包的作用就是要从函数外部来访问函数内部的变量。常规办法无法实现,那么,闭包就根据作用域的传统作用规律来实现。
具体原理步骤如下:
1.在JavaScript语言中,一个函数,其内部的子函数能访问其变量。如上面代码所示,函数displayAlert可以访问函数add中的变量count。
2.如上面代码所示,通过执行函数add来把函数displayAlert作为返回值返回出去,然后赋值给变量s,这时变量s就是函数displayAlert。变量s和函数displayAlert属于同一个作用域,就可以访问add函数中的变量count的值。
通过以上两个步骤,就能实现在函数外边来访问函数内部的变量。

闭包的作用

闭包的作用分为两个:函数外部访问函数内部的变量、让函数内部的变量始终保存在内存中,不随函数的执行完毕而销毁。

function s1() {
  var n = 100;
  num = function () { n += 1 }//让变量n自加,同时num属于全局变量

  function s2() {
    alert(n);
  }
  return s2;
}

var add = s1();
add(); //第一次执行add 变量n = 100
num();//执行num让n加一
add(); //第二次执行add 变量 n = 101

根据上面代码块可以证明,闭包可以让函数内部的变量始终存在于内存中。
在第一次执行函数add的时候,变量n初始化为100,函数执行完毕之后,按照常规,变量n就会被销毁。但是,执行函数num之后再执行函数add。发现变量n变为101。这证明变量n并没有被销毁。一直存在于内存中。

使用闭包时应注意

因为闭包可以让变量一直存在于内存中,所以很容易导致内存泄露,然后严重影响浏览器的性能。所以要在退出函数之前,把用不到的变量从内存中删除。




Last modification:March 28th, 2020 at 10:15 pm
如果觉得我的文章对你有用,请随意赞赏