美文网首页
JS中的闭包是什么?

JS中的闭包是什么?

作者: 周花花啊 | 来源:发表于2017-02-08 16:25 被阅读0次

一、首先简述什么是闭包


为什么会有闭包这个概念,我们知道函数内部可以直接读取全局变量,但是函数外部无法读取函数内部的局部变量。为了解决这个问题,人们想出了一个办法,那就是在函数的内部,再定义一个函数。

!function(){
    var n =999;
    function f2(){
        alert(n);
    }
}()

上面的代码中,有一个局部变量n,有一个函数f2,f2里面可以访问到n变量。

像上面这样函数f2就是一个闭包,闭包就是能够读取其他函数内部变量的函数

由于在JS语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。

现在疑问来了,闭包这么简单?我听说闭包是需要函数套函数,然后return一个函数的呢!

比如这样:
(正常情况下在函数f1外部是无法获取到它内部的变量n的。由于函数里面可以访问到函数外部的变量,所以人们就想出一个办法,在f1内部再定义一个函数,然后将这个函数return出来,这样就把f1里面的变量n带出来了。)

  function f1(){
    var n=999;
    function f2(){
      alert(n); 
    }
    return f2;
  }
  var result=f1();
  result(); // 999

这里面函数f2确实是一个闭包。

1.1、为什么要函数套函数呢?

就像一开始说的那样,本身就需要有一个局部变量,所以才把变量n放在一个函数里面,如果不把变量n放在一个函数里,n就是一个全局变量了,达不到使用闭包的目的——隐藏变量。

这也是上面为什么要放在一个立即执行函数里面。

所以函数套函数只是为了造出一个局部变量,跟闭包无关。

1.2、为什么要return f2呢?

因为如果不return,你就无法使用这个闭包。把return f2改成window.f2 = f2也是一样的,只要让外面可以访问到这个f2函数就行了。

所以return f2只是为了f2能被使用,也跟闭包无关。

二、闭包的作用


闭包常常用来间接访问一个变量。换句话说,隐藏一个变量。

假设我们在做一个游戏,在写其中关于还剩余几条命的代码。
如果不用闭包,你可以直接用一个全局变量:

window.lives = 30  //还有三十条命

这样看起来很不妥,我们不能让别人直接访问这个变量,那怎么办呢?

用局部变量,但是用局部变量别人又访问不到,怎么办呢?

暴露一个访问器(函数),让别人可以间接访问。
代码如下:

!function(){

  var lives = 50

  window.奖励一条命 = function(){
    lives += 1
  }

  window.死一条命 = function(){
    lives -= 1
  }

}()

那么在其他的JS文件,就可以使用window.奖励一条命()来涨命,使用 window.死一条命()来让角色掉一条命。

立即执行函数里面的两个匿名函数就是闭包。可以在函数外部对函数内部的局部变量进行操作。

(完)

相关文章

  • 题目

    闭包是什么?闭包的优缺点 this的指向问题? js中的基本类型? (没有object!) typeof 判断类型...

  • 闭包

    [程序员每日5分钟]JS 中的闭包是什么

  • JS闭包大结局(JS闭包系列3)

    在上一篇中再谈JS闭包(JS闭包系列2),我详细的介绍了JS中的变量作用域相关的概念,结合第一节关于JS闭包(JS...

  • 闭包是什么?用处如何?

    【js-04】闭包是什么?用处如何? ...

  • 2019-03-25 js闭包和内存释放

    闭包的那些事儿 怎么写一个闭包闭包是什么就不解释了,直接写一个闭包函数: js中,函数是一等公民,定义一个函数f,...

  • 简单的聊一下闭包

    js中的闭包 闭包是学习js中永远也绕不过去的一个坎,那么,今天我们就去一段简单的代码开始聊一聊闭包 什么是闭包 ...

  • 浅谈闭包

    js中的闭包 闭包是学习js中永远也绕不过去的一个坎,那么,今天我们就去一段简单的代码开始聊一聊闭包 什么是闭包 ...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • JS中的闭包是什么?

    一、首先简述什么是闭包 为什么会有闭包这个概念,我们知道函数内部可以直接读取全局变量,但是函数外部无法读取函数内部...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

网友评论

      本文标题:JS中的闭包是什么?

      本文链接:https://www.haomeiwen.com/subject/srzvittx.html