函数不是javascript

时间:2017-01-04 07:36:58

标签: javascript

我正在尝试使用揭示模块模式来组织我的代码,但我得到的myComponent不是函数错误。嗯有什么不对?

var canva = new fabric.Canvas('canvas');
var myComponent = function(canva) {

    var init = function() {
        console.log('init');
    };


    return {
        init:init
    };

}(canvas);

myComponent(canva).init();

4 个答案:

答案 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不是函数。