有没有办法在构造函数中声明函数?

时间:2014-04-14 11:46:45

标签: javascript

首先,我认识到在method.this vs var方法等方面有100多个线程。这不是我要问的。我知道不同之处。在使用构造函数创建对象的上下文中,我对函数表达式VS函数声明 感到困惑。

我想知道的是:为什么函数声明永远不会出现在构造函数中,但是函数表达式呢?每当我声明一个函数而不是使用一个表达式时,一旦启动它就无法在对象中访问它;这是为什么?

我认为这是因为它是本地的(也就是私有的)因此无法访问,或者在创建对象时,如果构造函数没有看到前缀为'这个',' var&#的函数39;或者' constructor.prototype',它会跳过它。

2 个答案:

答案 0 :(得分:4)

  

为什么函数声明永远不会出现在构造函数中,但是函数表达式呢?

他们

  

每当我声明一个函数而不是使用一个表达式时,一旦启动它就无法在对象中访问它;这是为什么?

你一定做错了。

  function Thing() {
    function go() {
      alert('Hello');
    }
    this.foo = 1;
    this.bar = function () {
      go();
    }
  }

  var x = new Thing();
  x.bar();
  

我认为这是因为它是本地的(也就是私人的)因此无法访问

函数声明是本地作用域。这并不会阻止您将它们分配到更广泛的范围,对象属性或在声明范围内使用它们。

答案 1 :(得分:1)

  

为什么函数声明永远不会出现在构造函数中,但是函数表达式呢?

他们这样做。您可以使用等效的函数声明轻松替换每个函数表达式。

  

每当我声明一个函数而不是使用一个表达式时,一旦启动它就无法在对象中访问它;这是为什么?

因为函数声明在当前范围内声明一个函数,就像var声明一个变量一样。另请参阅Javascript: Do I need to put this.var for every variable in an object?了解变量和属性之间的区别。

  

如果构造函数没有看到前缀为'this','var'或'constructor.prototype'的函数,它会跳过它。

不。这不是“看到前缀”。 正在编写代码,并且引擎不会知道正在执行的内容。函数表达式本身只是一个表达式,当将它分配到某个地方时,它会收集一个含义。当您将其分配给当前实例(this)的属性时,它将成为一种方法。使用函数声明也可以这样做:

function Constructor() {
    // creating local identifiers:
    var variable = function expression(){ };
    function declaration() { };

    // exporting properties:
    this.method1 = variable;
    this.method2 = declaration;
    // or without the local variable:
    this.method3 = function expression() { };
}