JavaScript:构造函数声明相对于它们的使用的位置,当在函数内部时

时间:2013-09-14 07:17:21

标签: javascript constructor declaration evaluation

像<{3}}这样的答案表明,当读取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

1 个答案:

答案 0 :(得分: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构造函数放在 test 函数之外。

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