Web 服务 - JavaScript 我们应该尽可能共享函数或创建新函数
web services - javascript should we share functions whenever possible or create new ones?
我想知道哪种情况有更多的"开销":
1(案例1:500万个对象共享30个功能。每次调用函数时,都会有开销,因为需要执行 f.call(instance、arg1、arg2 等(
//example code
function makeObject()
{
return { method1:func1,
method2:func2,
...
method30:func30 };
}
2( 情况 2:500 万个对象,每个对象有 30 个函数(= 1.5 亿个单独的函数实例(。每次调用函数时,都没有"路由开销",但当然要牺牲更多实例
//example code
function makeObject()
{
return { method1:func1.bind(asd),
method2:func2.bind(asd),
...
method30:func30.bind(asd) };
}
500万只是我的手指打出的一个数字,而我的大脑仍在为一个例子找出一个不错的数字。
基本上,我想知道我们是否应该尽可能共享功能或创建新功能?
(你可以假设我永远不会在整个页面的任何地方使用 eval 函数(
由于几乎所有现代浏览器都优化了prototype-
和scopeschain
查找,因此您绝对应该共享方法。
简单来说,优化技术是一种hash lookup table
,javascript引擎使用它来从out of scope
变量访问属性/方法。因此,与引擎必须爬取每个父作用域变量/激活对象的经典scope chain lookup
相比,开销很小。
这种优化lookup
只有在存在某种直接eval
代码时才会失败。由于eval
可以从上下文中更改属性,因此引擎必须回退到经典的查找算法(这有点慢(。
然而,500万个对象对于Javascript引擎来说是不真实的,我希望这些数字只是例子。在现实世界中,调用n
多个函数的 5m 对象将创建堆栈溢出和"运行脚本太长"错误。
仅parsing time
1.5亿个功能将是可耻的。
如果假设情况 2 是关于创建类似于以下内容的对象:
function makeObject()
{
return { method1:func1,
method2:func2,
...
method30:func30 };
}
然后,您将拥有 5m 个对象,每个对象有 30 个属性。不是"1.5 亿个单独的函数实例"。函数实例数仍将为 30。
创建 5m 的此类物体将花费您一些东西。添加属性比阅读它贵 3-10 倍左右。这意味着创建此类集合所需的时间可能比程序使用__proto__
访问使用一级间接寻址的方法所花费的时间更多。
简而言之:对于 5m/30 的情况,在大多数情况下,1 更理想。但在某些情况下,将方法引用放入对象本身是值得考虑的。例如,有限数量的频繁访问对象/方法(例如单例(。
为什么不这样呢?
:function myObject() { }
myObject.prototype.method1 = func1
myObject.prototype.method2 = func2,
...
myObject.prototype.method30 = func30
因此,如果您将对象创建为
var obj = new myObject();
然后,您将调用其方法为:
obj.method1();
obj.method2();
不需要call()
和其他魔法...
在这种情况下,您不需要使用相同的 30 个属性填充对象的每个实例。
- 如何在不使用 new 关键字的情况下从函数创建对象
- 如何使用特定的javascript函数创建一个url,以便在加载页面时运行
- geoTest函数-创建if/else语句
- D3数学函数创建
- Javascript:为函数创建回调
- 如何在追加函数创建后最小化单个框
- 对使用函数构造函数创建的函数的内部引用
- 获取使用函数构造函数创建的函数的名称
- 如何将函数绑定到使用链接函数创建 HTML 的角度指令
- 为什么可以't JavaScript构造函数创建字符串或数字
- 为什么用构造函数创建对象会执行对象's方法
- Jquery 函数创建一个异常的暂停
- JQuery.click,nor.on(“click”,..)与使用函数创建的ASP.NET和twitter boost
- 如何使用javascript函数创建可以调用javascript函数的聚合物元素
- 使用构造函数创建对象和返回对象有区别吗
- 通过父构造函数创建主干继承视图
- 使用构造函数创建的数字没有其值作为属性,请取消String与构造函数的链接
- 如何减少Crossfilter组函数创建的bucket数量
- 从两个单独的函数创建 JQuery 悬停
- 如何访问从函数创建和返回的对象的属性