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范围规则来编写您首先要表达的意思。