JavaScript:什么是Expando Property?

alt*_*ter 13 javascript memory-leaks

我在阅读有关JavaScript内存泄漏时遇到过这个属性.我被告知此属性仅在Internet Explorer中受支持,并负责循环引用.

我试图检查并发现此属性在任何浏览器中都不可用.任何人都可以提供有关此属性的任何见解以及它如何与内存泄漏相关联?

Gre*_*ham 12

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

在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
Run Code Online (Sandbox Code Playgroud)

添加到混合:.expando是一个仅IE的属性,"设置或检索一个值,指示是否可以在对象中创建任意变量." MSDN文章

另请参见StackOverflow上有关expando属性的一般性讨论.

  • 问题没有询问内存泄漏,但它确实有那个标签,sooo ....代码如上例所示永远不会导致内存泄漏问题.在向引用完全相同DOM元素的DOM元素添加属性时,似乎会遇到麻烦.(也许这对任何类型的对象都有问题?IDK我在内存泄漏和expando属性/对象上看到的每个讨论都以DOM元素为中心.) (4认同)

Ata*_*hev 6

简单地说,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
Run Code Online (Sandbox Code Playgroud)

可以在了解和解决Internet Explorer泄漏模式中找到更多信息

  • 我认为这里的重点是包含对其他元素的引用的expando属性可能会导致泄漏,但不会根据您的示例使用基元类型. (5认同)

Pet*_*tai 3

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

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