码迷,mamicode.com
首页 > Web开发 > 详细

JS 中的闭包理解

时间:2020-07-21 13:37:46      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:block   作用   嵌套   lock   使用   闭包   ++   function   内存   

闭包

如何产生闭包?

当一个嵌套的内部(子)函数引用了嵌套外部(父)函数的变量(函数)时,就产生了闭包

注意: 闭包存在于嵌套的内部函数中

产生闭包的条件?

  1. 函数嵌套
  2. 内部函数引用了外部函数的数据(变量或者函数)

作用:

  1. 使函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
    • 函数的生命周期:当函数执行完后,自动释放内部的变量
  2. 让函数外部可以操作函数内部的数据(变量、函数)
//延长了生命周期和操作局部函数的内部变量
function fn1() {
	var a = 1
  	function fn2() {
        a++
        console.log(a)
     }
     return fn2
}
var f = fn1()
f()  //2
f()  //3

缺点:

  1. 函数执行完后,函数内的局部变量没有释放,占用内存时间会变长 (解决: f = null)
  2. 容易造成内存泄漏

内存溢出和内存泄漏

内存溢出:

  • 一种程序运行出现的错误
  • 当程序运行需要的内存超过剩余的内存时,就会抛出内存溢出的错误

内存泄漏:

  • 占用的内存没有及时释放
  • 内存泄漏积累过多,就会造成内存溢出
  • 常见的内存泄漏:
    1. 意外的全局变量
    2. 没有及时请理的及时器或者回调函数
    3. 闭包

代码理解

var name = ‘The window‘
    var obj = {
      name: ‘The object‘,
      getName: function() {
        return function(){
          return this.name
        }
      }
    }
    console.log(obj.getName()());  //The window
/*
分析: 
	obj.getName():  function() { return this.name}    使 a = obj.getName()
	a(): this.name   这里就是全局调用,this指向window
	并且这里可以看出没有使用闭包
*/

    var name = ‘The window‘
    var obj = {
      name: ‘The object‘,
      getName: function() {
        var that = this
        return function(){
          return that.name
        }
      }
    }
    console.log(obj.getName()());  //The Object
/*
分析: 
	obj.getName():  function() { return that.name}    使 a = obj.getName()
	a(): that.name   这里就是全局调用,that指向obj中的this
	使用闭包
*/

JS 中的闭包理解

标签:block   作用   嵌套   lock   使用   闭包   ++   function   内存   

原文地址:https://www.cnblogs.com/xyf724/p/13353927.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!