【问题标题】:function expression vs function declaration with regard to javascript 'classes'关于javascript“类”的函数表达式与函数声明
【发布时间】:2011-06-13 06:19:13
【问题描述】:

在实现“私有方法”时,什么时候使用函数表达式而不是函数声明才有意义?在这两种情况下,函数都是封装的,唯一实际的区别似乎是我无法在构造函数中调用 myFunc1 。我知道我应该以任何一种方式使用原型属性,但我只是好奇。

function myClass
{
    myFunc1() //error
    myFunc2() //success

    var myFunc1 = function()
    {
    }

    function myFunc2()
    {
    }
}

【问题讨论】:

  • 两者除了你说的没有区别

标签: javascript oop class closures


【解决方案1】:

您可以调用分配给变量的函数,但您必须先分配它才能调用它:

function myClass() {

  var myFunc1 = function() {
  }

  myFunc1() //success
  myFunc2() //success

  function myFunc2() {
  }

}

这些函数是构造函数的本地函数,因此与使用原型不同。要创建公共函数,您需要将其分配给对象:

function myClass() {

  this.myPublicFunc1 = function() {
  }

  this.myPublicFunc2 = myFunc2;

  function myFunc2() {
  }

}

var o = new myClass();
o.myPublicFunc1() //success
o.myPublicFunc2() //success

【讨论】:

    【解决方案2】:

    如果你想立即调用函数,你必须使用表达式。

    这个调用它并将返回值赋给变量:

    function myClass {
    
        var myVar = function() {
           return 'some value';  // <--- 2. assign the return value to the variable
        }();  // <--- 1. invoke the function immediately
    
        function myFunc2() {
        }
    }
    

    这个调用它,但将函数本身分配给变量:

    function myClass {
    
        var myFunc1;
    
        (myFunc1 = function() {  // <--- 1. assign the function to the variable
           // Do something
        })();  // <--- 2. invoke the function immediately
    
        function myFunc2() {
        }
    }
    

    【讨论】:

    • 我不认为上面两个例子有什么实际区别。第一个在 RHS 表达式周围加上一组括号会更清楚,第二个只是复杂的。
    • @RobG:实际上,这两个例子完全不同。第一个分配返回值,第二个分配函数本身。
    • ...是的,我同意一组括号会增加第一个括号的清晰度,但它们不是必需的。我不认为第二个令人费解。
    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2014-05-31
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多