2017-01-04 2 views
0

Я пытаюсь организовать свой код, используя раскрывающий шаблон модуля, но я получил myComponent, это не ошибка функции. Хм, что случилось?Функция не является функцией в javascript

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

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


    return { 
     init:init 
    }; 

}(canvas); 

myComponent(canva).init(); 
+1

'function (canva) {' is IIFE, который возвращает объект с единственным свойством init, который является функцией ... обратите внимание, что это означает, что myComponent является возвращенным объектом, а не функцией –

ответ

1

Вы можете использовать этот синтаксис:

var myComponent = function(canva){ 
    //function body 
}(canvas); 

Однако, вы должны не вызывать функцию после декальпинга, поэтому вам нужно использовать следующие sy ntax вместо:

var myComponent = function(canva){ 
    //function body 
}// remove : (canvas); 
0

попробовать:

var myComponent = function(canva){ 

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


     return{ 
     init:init 
     } 

    }; 

// и использовать его в качестве

myComponent(null).init(); 
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(); 

(этот вариант полезен, если потребители вашего компонента/клиентам необходимо предоставить свою собственную параметризованную/настраиваемую зависимость для вашего компонента)

0

Короче говоря, это проблема с парсером, и вам нужно обернуть s Эльф-вызова функции с помощью скобок (см код ниже)

Когда парсер встречает функцию ключевого слова в глобальном масштабе или внутри функции, она воспринимает его как функция декларации (заявления), , а не как функции по умолчанию. Если вы явно не указали , скажите парсеру ожидать выражения, он видит, что он считает объявлением функции без имени и генерирует исключение 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 не является функцией.

Смежные вопросы