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

时间:2015-02-13 22:32:31

标签: 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()的上下文中执行的,但我不明白。< / p>

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

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

2 个答案:

答案 0 :(得分:4)

在致电Quad之后

},您不会将值分配给p5()。据推测,它试图立即使用它,此时未定义(虽然已经声明了,因为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
  }
})();

答案 1 :(得分:0)

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

在开始实现他的解决方案之后,它让我思考代码分离,并且我意识到我应该将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
    }
  )
});