0

像这样的答案表明,当读取 JavaScript 文件时,函数声明在第一次传递期间被加载到内存中,而表达式在随后的传递中被评估。但是,下面的示例显示函数内部的函数是在执行代码编译的。

为了使下面的代码工作,我必须将Child构造函数移到测试函数之外,或者将它放在调用之前,new Child()如果它要保留在test函数内部。在其当前位置,您将TypeError: this.init is not a method在运行代码时得到一个。

我在哪里可以找到有关何时评估函数中的函数声明的详细信息?

document.addEventListener('DOMContentLoaded', function() {
  test()
}, false)


function test() {
  // Child declaration can go here

  var child = new Child()

  // If Child is placed here, this.init is undefined
  function Child() {
    this.init()
  }
  Child.prototype = new Ancestor(Child)
}


function Ancestor(constructor) {
  this.constructor = constructor
}
Ancestor.prototype.init = function init() {
  console.log(this)
}

// Child declaration can go here
4

1 回答 1

1

问题是init方法来自Ancestor类。您在创建实例后继承它。例如下面的代码有效。

setTimeout(function() {
    test()
}, 200);

function test() {
  // Child declaration can go here

  Child.prototype = new Ancestor(Child);
  var child = new Child();  

  // If Child is placed here, this.init is undefined
  function Child() {
    this.init()
  }

}

function Ancestor(constructor) {
  this.constructor = constructor
}
Ancestor.prototype.init = function init() {
  console.log(this)
}

因此,只需将Child.prototype = new Ancestor(Child)移到调用new Child之上。您不需要将 Child 构造函数放在测试函数之外。

换句话说,在您的示例中,当您调用new Child时, init方法仍未附加到Child原型。

于 2013-09-14T07:28:06.273 回答