Javascript 是否每次创建实例时都会重新实例化构造函数中的私有函数声明?
Javascript 是否每次创建实例时都会重新实例化构造函数中的私有函数声明?,javascript,Javascript,private功能是否对性能造成了不必要的影响?是否与以下内容相同: function Meal(n) { function private(cal) { return cal * 2; } this.calories = private(n); } //private is being reinstantiated three times? var breakfast = new Meal(3); var lunch = new Meal(56); v
private
功能是否对性能造成了不必要的影响?是否与以下内容相同:
function Meal(n) {
function private(cal) {
return cal * 2;
}
this.calories = private(n);
}
//private is being reinstantiated three times?
var breakfast = new Meal(3);
var lunch = new Meal(56);
var dinner = new Meal(100);
写道:
构造函数返回的对象成为整个新表达式的结果
我在理解“整个新表达式的结果”时遇到了一些困难。这难道不意味着,因为私有函数声明在构造函数定义中,它们是“整个新表达式的结果”吗?javascript似乎足够聪明,不会像这样重新实例化私有函数,但我不确定
是否每次创建实例时都会重新实例化构造函数中的私有函数声明
是的,每次都会创建一个新的函数对象。如果引擎足够智能,底层代码可以在它们之间共享。V8(Chrome)是,我敢肯定,即使不是所有顶级引擎,也是大多数都将在2016年问世
因此,考虑到示例private
函数、它的功能和范围,我希望一个合适的引擎能够完全优化函数
private
功能是否对性能造成了不必要的影响
那是你的电话。在任何现代JavaScript引擎上创建函数都是非常非常快的
在这种特殊情况下,您显示的私有
没有使用任何仅在构造函数中可用的信息,因此没有特别的理由在构造函数中创建它。把它搬出去是有道理的。如果愿意,您仍然可以将其保留为私有,而无需每次重新创建:
function public(cal) {
return cal * 2;
}
function Meal(n) {
this.calories = public(n);
}
现在,private
只创建了一次,并且所有fine
实例都使用该函数。(膳食
也只创建一次。)
构造函数返回的对象成为整个新表达式的结果
这与你的主要问题基本无关。当您执行newsomefunction
时,JavaScript引擎将创建一个由SomeFunction.prototype
引用的对象支持的对象,然后使用this
调用SomeFunction
,引用该对象。如果SomeFunction
不返回任何内容,或返回类似42
的基元,或返回null
,则new
表达式的结果是对创建的new
对象的引用。如果SomeFunction
返回一个非null
对象引用,则这是new
表达式的结果
是否每次创建实例时都会重新实例化构造函数中的私有函数声明
是的,每次都会创建一个新的函数对象。如果引擎足够智能,底层代码可以在它们之间共享。V8(Chrome)是,我敢肯定,即使不是所有顶级引擎,也是大多数都将在2016年问世
因此,考虑到示例private
函数、它的功能和范围,我希望一个合适的引擎能够完全优化函数
private
功能是否对性能造成了不必要的影响
那是你的电话。在任何现代JavaScript引擎上创建函数都是非常非常快的
在这种特殊情况下,您显示的私有
没有使用任何仅在构造函数中可用的信息,因此没有特别的理由在构造函数中创建它。把它搬出去是有道理的。如果愿意,您仍然可以将其保留为私有,而无需每次重新创建:
function public(cal) {
return cal * 2;
}
function Meal(n) {
this.calories = public(n);
}
现在,private
只创建了一次,并且所有fine
实例都使用该函数。(膳食
也只创建一次。)
构造函数返回的对象成为整个新表达式的结果
这与你的主要问题基本无关。当您执行
newsomefunction
时,JavaScript引擎将创建一个由SomeFunction.prototype
引用的对象支持的对象,然后使用this
调用SomeFunction
,引用该对象。如果SomeFunction
不返回任何内容,或返回类似42
的基元,或返回null
,则new
表达式的结果是对创建的new
对象的引用。如果SomeFunction
返回一个非null
对象引用,则这是新的表达式的结果。“javascript似乎足够聪明,不会像这样重新实例化私有函数”在这个层次上,你可能会发现这是一个JS引擎的实现细节,我相信现代Javascript实现会优化这一点。如果这是一个真正的实际问题,我们将把所有东西都写成一个全局函数,这显然是毫无意义的。使用Javascript作用域规则来编写您首先要表达的意思。“看起来Javascript足够聪明,不会像这样重新实例化私有函数”您可能会发现在这个级别上,它是所涉及的JS引擎的一个实现细节。我相信现代Javascript实现优化了这一点。如果这是一个真正的实际问题,我们将把所有东西都写成一个全局函数,这显然是毫无意义的。使用Javascript范围规则来编写您首先要表达的意思。