首页 > 解决方案 > 内置函数对象方法如何使用比函数文字更多的内存?

问题描述

下面的代码片段定义了一个Robot()用作对象构造函数的函数——一个创建对象的函数。

function Robot(robotName) {
   this.name = robotName;
   this.sayHi = function () { console.log("Hi my name is "+this.name); };
   this.sayBye = function () { console.log("Bye!"); };
   this.sayAnything = function (msg) { console.log(this.name+" says "+msg); };
}

第二种方法是

function Robot(robotName) {
    this.name = robotName;
    this.sayHi = new Function ("console.log('Hi my name is '+this.name); ");
    this.sayBye = new Function ("console.log('Bye!'); ");
    this.sayAnything = new Function("msg","console.log(this.name+' says '+msg);" );
} 

我正在读的那本书说——

第二种方法的唯一缺点是它将使用更多的内存,因为每次创建 Robot 对象的新实例时都会创建新的函数对象。

我看到我喜欢下面的时候-

var wally = new Robot("Wally");

这两种方法中,沃利机器人都有3 个功能对象

wally.sayHi();    //1
wally.sayAnything("I don't know what to say");   //2
wally.sayBye();   //3

那么如何2nd approach 使用更多的内存呢?

标签: javascript

解决方案


当代码被解析时,它将变成引擎能够执行的内部表示。现在对于加载代码时发生一次的常规代码。如果您动态地将字符串转换为调用Function时发生的代码(如 )Function(),那么每次调用您的构造函数时。因此,使用第二种方法,引擎必须创建并保留代码的另一个内部表示,因此如果您创建 10.000 个实例,则必须有 10.000 个代码表示。此外,这不仅会消耗内存,还会降低性能,因为优化是在每个函数的基础上完成的,而且代码的解析也需要时间,所以第二种方法可能会执行得慢得多(是的,引擎可以优化这些差异,但我想它可能不会)。

还有一些其他的缺点:

1) IDE 中没有语法高亮显示

2)不可读的代码

所以永远,永远,永远不要使用第二个版本。并获得一本新书:

1)学习如何从字符串动态创建函数是没有意义的,你永远不必使用它。

2)它说第二个更糟,因为“每次创建 Robot 对象的新实例时都会创建新的函数对象”,这适用于第一个和第二个片段(所以这不是真正的原因)。


推荐阅读