为什么这个对象不在范围内?

Why is this object not in scope?

参见下面的代码示例:

( function(){
  var test = new p5(
    function ( p ){
       var x = new Quad(); // Quad is undefined
    }
  ),

  Quad = function(){
     // some code
  }
})();

我怀疑它与外部库(本例中的p5)有关,因为匿名函数是在new p5()的上下文中执行的,但我不明白。

我认为因为 Quad 是在主闭包的范围内定义的,所以它应该可用于该闭包内定义的任何内容...

你能解释一下为什么我的想法是错误的吗?

在 调用 p5() 之后 之前,您不会为 Quad 赋值。大概它会尝试立即使用它,此时未定义(尽管已声明,因为 var 的效果已经应用)。

调换语句两部分的顺序。

( function(){
  var  Quad = function(){
     // some code
  }, test = new p5(
    function ( p ){
       var x = new Quad(); // Quad is undefined
    }
  )
})();

或者改用函数声明(将被提升)。

( function(){
  var test = new p5(
    function ( p ){
       var x = new Quad(); // Quad is undefined
    }
  );
// Note semi-colon above. You aren't creating multiple variables with `var` in a single statement any more.
  function Quad (){
     // some code
  }
})();

正如@Quentin 正确指出的那样,这是由于变量没有被提升,而不是函数,后者是。

开始实施他的解决方案后,我开始考虑代码分离,我意识到我真的应该将 Quad 定义拆分到它自己单独的 JS 文件中。

所以我利用 require.js 并将代码重写为如下所示:

require("Quad", function(){
  var test = new p5(
    function ( p ){
       var x = new Quad(); // Quad is defined in Quad.js, loaded in via require.js
    }
  )
});