【问题标题】:Deleting a property of an object inside its definition; Why?删除其定义内的对象的属性;为什么?
【发布时间】:2015-08-25 10:01:58
【问题描述】:

查看最近的 Google Maps API loader source,我想知道下面的目的是什么:

google.maps.Load = function(apiLoad) {
    delete google.maps.Load;
    ...

你为什么要delete 一个对象的属性,在它的定义中?我怀疑它可能会提高一些性能,但无法弄清楚属性如何在其定义中删除自己。

【问题讨论】:

  • delete always 让事情变得更慢(至少在 V8 中)。在这种情况下,它可能会自行清理,因此不可能意外Load 它两次。如果这个假设成立,那么更好的解决方案是将其重新分配给一个空函数:google.maps.Load = function() {};
  • @zerkms 好吧,我认为它会释放一些内存,从而提高整体性能——即使它可能是一个缓慢的调用。对吗?
  • 这是不对的。详情请见debuggable.com/posts/…
  • google.maps.Load = function() { throw new Error("Already loaded") }; 似乎更健壮。
  • @Sam 你介意发表你的评论作为答案吗?干杯。

标签: javascript javascript-objects


【解决方案1】:

显然我们只能做出假设,因为只有代码作者可以肯定地说。

如果原因是为了确保Load 过程只执行一次,那么所选择的决定真的很糟糕。

问题是删除属性使得 V8(可能是其他引擎)无法使用所谓的“隐藏类”(这是一种用于更快地查找对象属性的优化方法)。

更好的选择是

google.maps.Load = function() {};

google.maps.Load = function() { throw new Error("Already loaded") };

按照@Samcomments 中的建议。

参考资料:

【讨论】:

  • 这里有非常有趣的信息,非常感谢分享这些信息。
【解决方案2】:

我会说只允许加载一次。

【讨论】:

  • 有道理!将它放在定义的末尾而不是第一行不是更好吗?
  • 从哪个角度更好?
  • @Mahdi IMO 顶部更透明,即 这是一次性功能,我也会这样做 :)
【解决方案3】:

这是为了确保 API 只加载一次。但是,这不会在第二次调用该函数时抛出有用的错误,但可能会导致异常。

这是一个替代解决方案,它会引发更有用的错误。

google.maps.Load = function() { throw new Error("Already loaded") };

【讨论】:

  • 我接受这个答案,因为它最初提供了这个解决方案。
猜你喜欢
  • 2020-04-14
  • 1970-01-01
  • 2021-11-10
  • 2012-01-10
  • 2017-09-23
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多