Javascript 私有方法:函数表达式与函数声明

Javascript private methods: function expression vs function declaration

在 javascript 中创建(各种)私有方法的常用方法是:

Class = function (arg0, arg1) {
    var private_member = 0;
    var privateMethod = function () {
        return private_member;
    };
}

上面的例子也可以用函数声明而不是函数表达式来完成:

Class = function (arg0, arg1) {
    var private_member = 0;
    function privateMethod () {
        return private_member;
    }
}

这两种声明私有方法的方式有何不同? (除了一个是表达式,另一个是声明)

例如,显然每次调用构造函数时,表达式都会生成一个新函数。这是否也发生在函数声明中,或者它是否只被评估一次,因为函数声明是在解析时评估的? (与在执行时评估的函数表达式相反,您明白了。)

编辑:我知道 javascript 真的 没有私有方法。我松散地使用这个词。

编辑:不是 var functionName = function() {} vs function functionName() {}, if anything a duplicate of function expression vs function declaration with regard to javascript 'classes' 的副本。我的问题不是一般的函数表达式和函数声明之间的区别,而是它们在 javascript "classes".

中 "private members" 的具体区别

几乎没有区别:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions#Function_constructor_vs._function_declaration_vs._function_expression

更重要的是,它们不是私有方法(JavaScript 中不存在)。您创建的方法只能在构造函数内部访问,极大地限制了它们的价值。

the expression obviously generates a new function everytime the constructor gets called. Does this happen with the function declaration aswell [...]?

无论哪种方式,每次都会生成一个新函数

because function declarations are evaluated at parse time

函数声明的提升方式与 vard 标识符的提升方式类似。这发生在他们所在范围的调用开始时

In what ways are these two ways of [defining a] method different?

这与其他地方相同,您可以在定义行之前的行上引用函数声明(假设它在您的范围内)

foo.bar; // undefined
function foo() {}

vs 函数表达式还没有被提升,所以标识符 foo 是可引用的,但是你不能引用你将分配给它的 function 直到在

之后
foo.bar; // TypeError: Cannot read property 'bar' of undefined
var foo = function () {};
// same as
var foo;
foo.bar; // TypeError: Cannot read property 'bar' of undefined
foo = function () {};

请确保您理解 JavaScript 与经典编程语言不同; publicprivate 这两个词被经典程序员在谈论 JavaScript[=41 时使用=]分别表示"externally Referenceable""not externally Referenceable"
同样,实际上并没有 Class 这样的东西(即使在 ES 6 中,它只是我们的语法糖已经在 ES 5 中完成了)。相反,我们有构造函数原型链

主要区别是

函数声明在它的封闭范围内得到提升让我们说

var Klass = function() {

   return {
     publicMethod: privateMethod
   };

   function privateMethod() {

   }
}

你可以在return下面引用privateMethod,因为privateMethod会在函数Klass中被提升,但是你不能用function expression

var Klass = function() {

   return {
     publicMethod: privateMethod    // privateMethod will be undefined
   };

   var privateMethod = function () {

   }
}

你不能引用函数表达式的方法名

var method = function() {
  if(somecondition) {
    method();                         
  }
}

你必须给它起个名字,总是使用命名方法

var method = function method() {
  if(somecondition) {
    method();
  }
}