为什么这个对象不在范围内?
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
}
)
});
参见下面的代码示例:
( 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
}
)
});