【问题标题】:JavaScript: What is the Expando Property?JavaScript:什么是 Expando 属性?
【发布时间】:2011-04-01 13:17:08
【问题描述】:

我在阅读有关 JavaScript 内存泄漏的信息时遇到了这个属性。 我被告知该属性仅在 Internet Explorer 中受支持,并且负责循环引用。

我尝试检查并发现此属性在任何浏览器中均不可用。谁能提供有关此属性的任何见解以及它与内存泄漏的关系?

【问题讨论】:

    标签: javascript memory-leaks


    【解决方案1】:

    我也是带着同样的问题来到这里的,也是在阅读了一篇关于内存泄漏的文章之后。在这里阅读答案后我仍然感到困惑,所以我想在进行更多研究后分享我的发现。

    在 JavaScript 中,要知道 .expandoProperty 之类的东西是语言的一部分还是有人对属性名称很聪明,这可能会让人感到困惑。

    内存泄漏文章中的obj.expandoProperty 也可以是obj.foo。他们试图通过使用“.expandoProperty”来传达的一点是,该属性最初并不作为对象的一部分存在。

    var obj = {myProp: ''};
    obj.myProp    = 'foo';  //myProp is not an expando property
    obj.myNewProp = 'bar';  //myNewProp is an expando property
    

    添加到组合中:.expando 是一个仅限 IE 的属性,它“设置或检索一个值,指示是否可以在对象中创建任意变量。” MSDN article

    另见generalized discussion of expando properties on StackOverflow here

    【讨论】:

    • 这个问题并没有问到内存泄漏问题,但它确实有那个标签,sooo....像上面的例子这样的代码永远不会导致内存泄漏问题。将属性添加到引用相同 DOM 元素的 DOM 元素时,问题似乎开始发挥作用。 (也许这对任何类型的对象都是一个问题?IDK 我看到的关于内存泄漏和以 DOM 元素为中心的扩展属性/对象的每次讨论。)
    【解决方案2】:

    简单地说expando属性就是一个原本不存在的属性。在 Internet Explorer 中,如果为 DOM 元素创建这样的属性,最终可能会导致内存泄漏。这是一个例子:

    var div = document.getElementsByTagName('div')[0];
    div.someProperty = true; // 'someProperty' is an expando property which may introduce a memory leak in IE
    

    更多信息可以在Understanding and Solving Internet Explorer Leak Patterns找到

    【讨论】:

    • 我认为这里的重点是包含对其他元素的引用的 expando 属性可能会导致泄漏,但不会像您的示例那样使用基元类型。
    【解决方案3】:

    我认为您的意思是 expando Property... 带有空格,指的是对象的 expando 属性。它:

    设置或检索一个值,该值指示是否可以在对象中创建任意变量。

    【讨论】:

      猜你喜欢
      • 2011-10-07
      • 1970-01-01
      • 2018-04-30
      • 2012-08-16
      • 2012-03-12
      • 2012-11-01
      • 2017-10-19
      • 1970-01-01
      • 2014-09-02
      相关资源
      最近更新 更多