美文网首页
JavaScript闭包

JavaScript闭包

作者: 椰果粒 | 来源:发表于2019-06-27 16:53 被阅读0次

闭包是什么

  • 闭包是一个函数
  • 闭包能访问函数内部的变量
  • 创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,
  • 利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。

闭包的特性:

  1. 函数内再嵌套函数
  2. 内部函数可以引用外层的参数和变量
  3. 参数和变量不会被垃圾回收机制回收

闭包的作用

有两大作用:

  • 访问函数内部的变量
  • 将变量保存在内存中,不会使变量在函数销毁后变量自动清除

为啥说不会使变量在函数执行完以后销毁了

function f1(){
  var a = 342;
  // 这就是一个闭包函数
  return function (){
    console.log(a)
  }
}
f1()(); // 342

原因就是这个闭包函数成了一个全局函数,始终在内存中,而这个闭包函数是依赖f1函数存在的,所以说f1也始终在内存中,不会在掉用完之后被垃圾回收机制回收了。
如果是一个函数里边的变量,在函数执行完之后,就会被回收了。
如果是全局变量,会一直在内存中(因为系统不知道啥时候还能再用到这个全局变量),不会被回收。

闭包在开发中的作用

在实际开发中,闭包主要用于封装变量,收敛权限。

比如,我们判断一个数组中是否存在某个元素,不存在就返回不存在且将这个元素存进去;存在就返回存在。
我们在做这个例子时,希望不能随便修改list这个数组,只是传入某个元素,以此来判断。

function check(){
  var list = []
  return function(item){
    if(list.indexOf(item) > -1){
      console.log("存在")
    }else{
      console.log("不存在")
      list.push(item)
    }
  }
}
var c1 = check();
c1("aaa") // 不存在
c1("aaa") // 存在
c1("bbb") // 不存在

这里,如果外界想访问list数组,只能通过check函数访问,
我对想访问list的外界只提供了check()这一个接口。至于怎么操作list,我已经定义好了,外界能做的就只是使用我的函数,然后传几个不同的参数罢了。

几个示例:

function outer(){
    let num = 0;
    return function add(){
        num++;
        console.log(num)
    }
}
let f1 = outer()
f1()
f1()
let f2 = outer()
f2()
f2()
// 1 2 1 2
let scope = "global scope";
function checkScope (){
    let scope = "local scope";
    function f(){
        return scope;
    }
    return f
}
console.log(checkScope()());  // local scope
let scope = "global scope";
function checkScope (){
    let scope = "local scope";
    return scope
}
console.log(checkScope())   // local scope 

过度使用闭包的危害

很多高级应用都要靠闭包来实现

但是,闭包是把函数中的变量保存在内存中了,内存消耗很大,如果滥用闭包会造成页面性能问题,在IE中会造成内存泄露。
解决方法:在退出函数之前,将不再使用的局部变量删除掉

闭包会在父函数外部,改变父函数内部变量的值。
所以把父函数当做对象使用,把闭包当做它的公共方法,把内部变量当成私有属性时,不要随便修改父函数内部变量的值。

相关文章

  • JavaScript----闭包

    javascript之闭包 闭包的概念     闭包(closure)是 JavaScript 的一种语法特性。 ...

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

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

  • javascript中闭包是什么

    javascript中闭包是什么 JavaScript 变量可以是局部变量或全局变量。私有变量可以用到闭包。闭包就...

  • Javascript 闭包

    闭包 (注:所以案例以 javascript 实现) 初识闭包 什么是闭包 MDNClosures are fun...

  • 作用域闭包

    概览 背景知识:JavaScript内存管理、JavaScript作用域。 内容 1 闭包定义 闭包:当函数可以记...

  • JavaScript 作用域

    概览 背景知识:JavaScript内存管理、JavaScript作用域。 内容 1 闭包定义 闭包:当函数可以记...

  • 20170815 前端开发日报

    JavaScript闭包,只学这篇就够了 闭包不是魔法 这篇文章使用一些简单的代码例子来解释JavaScript闭...

  • JavaScript深入理解-闭包(Closure)

    推荐文章:学习Javascript闭包(Closure)- 阮一峰javascript深入理解-从作用域链理解闭包...

  • 闭包

    学习Javascript闭包(Closure)

  • JS之闭包与IIFE

    本篇文章主要讨论了: JavaScript引擎 全局对象 闭包 循环 + 闭包 IIFE + 闭包 1.JavaS...

网友评论

      本文标题:JavaScript闭包

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