suchen

Heim  >  Fragen und Antworten  >  Hauptteil

javascript – Lösen Sie einige kleinere Probleme mit JS-Funktionen

Bezieht sich der Funktionsname von js auf den Speicher, da er ein Zeiger auf das Funktionsobjekt ist?
`

        var a=function(c){
            return  ++c;
        }
        console.log(a(1));

        var b=a;
        console.log(b(1));

        var a=null;
        console.log(b);
        console.log(b(1));

` , also wie führt man eine manuelle Zerstörung durch? Müssen globale Variablen geschlossen werden, bevor der Browser recycelt wird? Vielen Dank für die Lösung

为情所困为情所困2794 Tage vor566

Antworte allen(5)Ich werde antworten

  • 迷茫

    迷茫2017-05-19 10:28:59

    首先var a会在stack里面开一块空间,然后你将他赋给一个function,是一个引用类型,于是又在heap里面又申请一块空间存放function,此时,stack里面的a存放的是function的地址

    而下面,将b赋值给a,是将stack里面a指向的heap里面function的地址赋给b,所以这就是为什么后来a指向了null,但是b仍然指向之前heap里面function的原因。

    如何销毁?将b也设置为null或者其他值就好了。所以这种变量尽量不要写全局的,写局部变量。

    Antwort
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:28:59

    是不是引用内存? 这问题有点太宽了, 数据都是放在内存里的, 自然需要引用内存
    但又不止引用内存那么简单, 内存只负责存数据, 数据间的关系是没法体现的, 所以不是直接引用内存
    中间是有隐藏处理的, 怎么操作有基本的理论, 但实际上很少人知道具体的细节, 太底层了

    另外, 回收的话有两种做法:

    1, 设置null, 等待自动清空
    a = null;
    会在回收程序执行的时候自动清空
    2, 立刻清空
    delete a;
    直接执行回收
    但老ie并不支持这种操作

    一般直接用方法1就行, 不必担心会溢出, 自动回收会有多种触发, 比如定时, 比如数据达到一定量

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-19 10:28:59

         // 那么在最后应该将 op 解除引用来避免内存泄漏。
         // 所谓的内存泄露,就是被分配的内存既不能被使用,也不能够被回收的一个现象。
         // 低版本的IE浏览器中,DOM对象与javascript对象形成循环引用,
         // 那么就有可能产生内存泄露,除非人为的切断引用。
    
         function box() {
            var op = document.getElementById('op');
            var text = op.innerHTML;
            op.onclick = function () {
                alert(text);
             };
             op = null; //解除引用
         }
            
        box();
            
        // 节省内存
        // PS:如果并没有使用解除引用,那么需要等到浏览器关闭才得以释放。

    Antwort
    0
  • 漂亮男人

    漂亮男人2017-05-19 10:28:59

    js用delete可以手动回收变量

    Antwort
    0
  • 黄舟

    黄舟2017-05-19 10:28:59

    关于垃圾回收机制:
    在IE旧版本下,DOM是COM对象的形式,采用引用次数计数清除,如果有循环引用的情况,那么就一直都不会得到释放内存的机会。
    在标准浏览器中是标记清除的方法,只需要手动解除将引用设置为null就可以释放内存了。

    如果没有解除引用,那么会到离开执行环境时才释放内存,而全局的变量对象也就得等到全局执行环境退出时才会释放这部分的内存,即关闭浏览器时才会释放。

    Antwort
    0
  • StornierenAntwort