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

时间:2015-10-27 23:51:26

标签: javascript function private-methods function-declaration function-expression

在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() {}重复,则与function expression vs function declaration with regard to javascript 'classes'不重复。我的问题不是关于函数表达式和函数声明之间的区别,而是它们在javascript“类”中的“私有成员”方面的差异。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

  

每次调用构造函数时,表达式显然会生成一个新函数。这是否发生在函数声明中以及[...]?

每次都可以通过任何一种方法生成一个新函数

  

因为函数声明是在分析时计算的

提升函数声明与提升var d标识符的方式类似。这发生在调用

中的范围的开始时
  

这两种[定义]方法的方式有何不同?

这与其他地方相同,你可以在定义行之前在行上引用函数声明(假设它在你的作用域中)

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

vs函数表达式尚未被提升,因此标识符foo是可引用的,但您无法引用已分配给它的函数,直到之后

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 与经典编程语言不同;经典程序员在谈论 JavaScript 以表示&#34;外部可引用的&#34; <时,使用 public private 这两个词/ em>和&#34;分别不是外部可引用的&#34; 同样地,实际上并没有 Class 这样的东西(即使在 ES 6 中,它只是我们已经在 ES 中所做的语法糖em> ES 5 )。相反,我们有构造函数原型链

答案 2 :(得分:0)

主要区别是

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

var Klass = function() {

   return {
     publicMethod: privateMethod
   };

   function privateMethod() {

   }
}

你可以在返回的下面引用privateMethod,因为privateMethod将在函数Klass中提升,但你不能用函数表达式

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();
  }
}