javascript - 闭包如何定义以及垃圾回收的小问题

查看:123
本文介绍了javascript - 闭包如何定义以及垃圾回收的小问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

闭包我看描述是说 由函数和其外部词法环境组成,只要函数能够访问外部词法环境中的变量 即为闭包,广义上说任何函数都可以是闭包.

function cd(){
    var a = 0;
    function add(){
        a++;
        console.log(a);
    } 
    add();
}
  
cd(); 
cd();

问题 1 这个代码中 add() 算不算是不是闭包?

function cd(){
    var a = 0;
    function add(){
    a++;
    console.log(a);
    }
    return add();
 }
var test = cd(); test(); test();

问题2 这段代码 哪个是闭包? test是闭包?还是add是闭包?

问题3 垃圾回收机制
变量是怎么回收的? 是在当前的词法环境中 这个变量就没了吗,不存在词法环境的记录项record里面?
闭包使变量不被回收,如何理解?是不是由于闭包存在,导致这个变量在词法环境中一直存在,可以给闭包拿来使用?

解决方案

发现了一个热乎乎刚出炉的回答
你先看上面的这个吧


谈谈我的理解。

1.内部作用域对外部作用域变量的引用都算闭包。
2.函数的正常执行流程是函数执行完毕,函数作用域内的变量应该是无用的,对应的内存会被回收直到下次调用函数重新创建。然而会出现以下情况。

function fun() {
    var a = 1
    //先这么写一下 其实newFun函数名没用
    return function newFun () {
        console.log(a)
    }
}
var result = fun()

fun()执行完毕后returnnewFunresult接收,然后a又被newFun引用都没有被释放,这种才是我们平常要考虑的闭包。

先回到你的问题。

function cd(){
    var a = 0;
    function add(){
        a++;
        console.log(a);
    } 
    // add函数执行时,引用了cd中的a,存在闭包。执行完毕引用也就不需要了。
    add();
} 
// cd执行完毕之后也没有什么东西还保持着对变量或函数的引用,所以此时不存在"活跃"(可能不太恰当)的闭包
cd();

function cd(){
    var a = 0;
    function add(){
    a++;
    console.log(a);
    }
    return add();
 }
// 执行完test = cd()之后test到底是什么?undefined
// 在在add部分肯定是存在闭包的,引用了cd中的a
// 但是test = cd()之后,cd内的任何东西的都没有被保持引用了。闭包也就不在了。
var test = cd(); test(); test();
// 后面两个test()相当于undefined()会报错的

垃圾回收

js的垃圾回收我理解的也不是很清楚怕误导就不讲了,但是一般存在两种方式,标记清除和引用计数法。
闭包和引用的关系我觉得是由于引用存在,所以变量等无法被释放才导致了闭包的存在,然后才可能导致内存泄漏等一些情况

这篇关于javascript - 闭包如何定义以及垃圾回收的小问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆