我正在尝试使用揭示模块模式来组织我的代码,但我得到的myComponent不是函数错误。嗯有什么不对?
var canva = new fabric.Canvas('canvas');
var myComponent = function(canva) {
var init = function() {
console.log('init');
};
return {
init:init
};
}(canvas);
myComponent(canva).init();
答案 0 :(得分:1)
您使用以下语法:
var myComponent = function(canva){
//function body
}(canvas);
但是,在对其进行处理后,您不必调用该函数,因此,您必须使用以下语法:
var myComponent = function(canva){
//function body
}// remove : (canvas);
答案 1 :(得分:1)
您可以默认使用画布初始化该功能,也可以将其作为参数提供,但不能同时提供。
var canva = new fabric.Canvas('canvas');
var myComponent = function(canva){
var init = function(){
console.log('init')
}
return{
init:init
}
}(canva);
myComponent.init();
(如果组件的使用者/客户端不需要配置使用过的画布/依赖项,则此变体很有用)
或
var canva = new fabric.Canvas('canvas');
var myComponent = function(canva){
var init = function(){
console.log('init')
}
return{
init:init
}
};
myComponent(canva).init();
(如果组件的使用者/客户需要为组件提供自己的参数化/自定义依赖关系,则此变体很有用)
答案 2 :(得分:0)
尝试:
var myComponent = function(canva){
var init = function(){
console.log('init')
}
return{
init:init
}
};
//并将其用作
myComponent(null).init();
答案 3 :(得分:0)
长话短说,这是一个解析器问题,你需要用括号包装自调用函数(参见下面的代码)
当解析器在全局范围内遇到function关键字时 在函数内部,它将其视为函数声明(语句), 而不是作为函数表达式,默认情况下。如果你没有明确说明 告诉解析器期望一个表达式,它会看到它的想法 没有名称的函数声明并抛出SyntaxError 异常,因为函数声明需要名称。
上述确切措辞可以归结为:http://benalman.com/news/2010/11/immediately-invoked-function-expression/
var myComponent = (function(canva) {
var init = function() {
console.log('init');
};
return {
init:init
};
})(canvas);
var canva = new fabric.Canvas('canvas');
myComponent.init();
另外,将myComponent(canva).init();
更改为myComponent.init();
。 myComponent
不是函数。