1

在 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() {}的重复,如果有任何关于 javascript 'classes' 的函数表达式与函数声明的重复。我的问题不是一般的函数表达式和函数声明之间的区别,而是它们在javascript“类”中的“私有成员”方面的区别。

4

3 回答 3

1

每次调用构造函数时,表达式显然都会生成一个新函数。函数声明是否也会发生这种情况[...]?

任何一种方法每次都会生成一个新函数

因为函数声明是在解析时评估的

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时使用公共私有这两个词分别表示“可外部引用”“不可外部引用”。 类似地,实际上并没有Class这样的东西(即使在ES 6中,它也只是我们在ES 5中所做的语法糖)。相反,我们有构造函数原型链

于 2015-10-27T23:57:31.250 回答
0

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

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

于 2015-10-27T23:57:24.083 回答
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();
  }
}
于 2015-10-28T00:20:06.730 回答