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

Javascript 为什么这个对象不在范围内?,javascript,scope,closures,p5.js,Javascript,Scope,Closures,P5.js,请参见下面的代码示例: ( function(){ var test = new p5( function ( p ){ var x = new Quad(); // Quad is undefined } ), Quad = function(){ // some code } })(); 我怀疑它与外部库有关(本例中为p5),因为匿名函数是在new p5()的上下文中执行的,但我不理解它 我认为,因为Quad是在主闭包的范围内定义的

请参见下面的代码示例:

( 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
    }
  )
})();
或者使用功能声明(将被提升)代替


只有在调用
p5()
之后,才能为
Quad
赋值。它可能会立即尝试使用它,但在这一点上是未定义的(尽管它是声明的,因为
var
的效果已经应用)

切换语句两部分的顺序

( function(){
  var  Quad = function(){
     // some code
  }, test = new p5(
    function ( p ){
       var x = new Quad(); // Quad is undefined
    }
  )
})();
或者使用功能声明(将被提升)代替


正如@Quentin正确指出的那样,这是由于VAR没有被提升,而不是功能被提升

在开始实现他的解决方案后,我开始考虑代码分离,我意识到我应该真正将Quad定义拆分为它自己单独的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
    }
  )
});

正如@Quentin正确指出的那样,这是由于VAR没有被提升,而不是功能被提升

在开始实现他的解决方案后,我开始考虑代码分离,我意识到我应该真正将Quad定义拆分为它自己单独的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
    }
  )
});

谢谢@Quentin-我忘了变量不是像函数那样被提升的。这是一个基本的错误-我感谢你提供的例子。谢谢@Quentin-我忘了变量不是像函数那样被提升的。这是一个基本的错误-我感谢您提供示例。它在声明和分配之后是可用的…@dandavis-但在分配之前是不可用的,这正是问题所在。@Quentin:代码可能是正确的,这取决于p5函数以及它调用传递的函数的时间。声明将按照OP的预期关闭,但在分配Quad之前不会取消定义。如果p5只需等待一段时间,一切都如图所示,但如果p5立即执行,则所有希望都将破灭。@dandavis-如果它等待,则不会出现错误,因此我们知道它不会出现错误。它在声明和分配之后可用…@dandavis-但在分配之前不可用,这才是重点。@Quentin:代码可能是正确的,这取决于p5函数以及调用传递的函数的时间。声明将按照OP的预期关闭,但在分配Quad之前不会取消定义。如果p5只需等待一小段时间,一切都如图所示,但如果p5立即执行,则所有希望都将破灭。@dandavis-如果它等待,则不会出现错误,因此我们知道它不会。