javascript - 内置函数对象方法如何使用比函数文字更多的内存?
问题描述
下面的代码片段定义了一个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
使用更多的内存呢?
解决方案
当代码被解析时,它将变成引擎能够执行的内部表示。现在对于加载代码时发生一次的常规代码。如果您动态地将字符串转换为调用Function
时发生的代码(如 )Function()
,那么每次调用您的构造函数时。因此,使用第二种方法,引擎必须创建并保留代码的另一个内部表示,因此如果您创建 10.000 个实例,则必须有 10.000 个代码表示。此外,这不仅会消耗内存,还会降低性能,因为优化是在每个函数的基础上完成的,而且代码的解析也需要时间,所以第二种方法可能会执行得慢得多(是的,引擎可以优化这些差异,但我想它可能不会)。
还有一些其他的缺点:
1) IDE 中没有语法高亮显示
2)不可读的代码
所以永远,永远,永远不要使用第二个版本。并获得一本新书:
1)学习如何从字符串动态创建函数是没有意义的,你永远不必使用它。
2)它说第二个更糟,因为“每次创建 Robot 对象的新实例时都会创建新的函数对象”,这适用于第一个和第二个片段(所以这不是真正的原因)。
推荐阅读
- java - 如何在 SpringBootTest 案例中手动将数据刷新到数据库中?
- c# - 读取和写入文本文件
- git - git更改父分支
- soap - 使用 Spring-WS 路由 WS-Addressing 响应
- excel - 我如何在 VBA 宏中告诉 MS Word,如果它找到“文本”,它应该在“文本 2”下面写我
- javascript - React - 单击按钮时禁用行
- django - 使用自定义数据类型归档的 Django Rest Framework Seralize 持续时间
- oracle - 合计一个组内的金额并且不包括重复值
- python - 如何使用@符号来装饰python中的函数
- c# - 搜索控件。C#、WinForms、用户控件