在ExtJS中销毁Component之后,引用变量会发生什么?

时间:2015-02-25 17:34:29

标签: javascript extjs

ExtJS新手。我有以下代码。

var comp;
console.log('comp is - ' + comp);
comp = Ext.create('Ext.Component', {
    listeners : {
        beforedestroy : function(comp) {
            console.log('beforedestroy .. ');
        },
        destroy : function(comp) {
            console.log('destroy .. ');
        }
    }
});
console.log('comp is - ' + comp);
console.log('comp id is - ' + comp.getId());
comp.destroy();
console.log('comp is - ' + comp);
console.log('comp id is - ' + comp.getId());

chrome的控制台输出是

comp is - undefined
comp is - [object Object]
comp id is - component-1009
beforedestroy .. 
destroy .. 
comp is - [object Object]
comp id is - component-1009

即使在组件被销毁之后,变量仍然保持对原始组件的引用。我希望变量在destroy之后具有undefined或null值。这是正常行为吗?

2 个答案:

答案 0 :(得分:4)

由于JavaScript没有类似C ++的引用,因此Ext-JS无法使您对现有组件的引用无效。

例如:

var a = {b:2};
var b = a;  
// a and b both reference `{b:2}`, there is nothing you can do 
// to `{b:2}` that would change a or b to be null

您可以使用未记录的isDestroyed属性检查组件是否已被销毁。

comp.isDestroyed // true

您还会注意到该组件已从注册表中删除

Ext.getCmp(comp.id); // undefined

答案 1 :(得分:1)

您看到的行为符合文档所声称的内容。

  

尝试通过删除所有事件来销毁传递给它的任何对象   侦听器,从DOM中删除它们(如果适用)并调用   他们的破坏功能(如果有的话)。这种方法主要是   用于Ext.Element和Ext.Component类型的参数,但是任何参数   Ext.util.Observable的子类可以传入。任意数量的   元素和/或组件可以在a中传递给这个函数   单个调用作为单独的参数。

来源 - http://docs.sencha.com/extjs/4.2.1/#!/api/Ext-method-destroy

如果查看源代码,它不会删除任何地方的实际组件。即,在调用destroy之后,该组件将几乎无用,但这与被垃圾收集的对象不同。