2015-04-05 2 views
-2

Попытка создать небольшой экспорт модулей. Я требую, чтобы var myFunc() = function()... был неповрежден, код, который я пытаюсь сделать модулем, довольно сложный.Undefined не является функцией: Экспорт модуля

Вот файл js/test.js:

module.exports = { 
    app: function() { 
     var myFunc = function (arg) { 
      return 'working '+arg; 
     } 
    } 
};  

Выполнить его:

var test = require('./js/test.js'); 
console.log(test.app.myFunc('now')); 

Здесь ошибка:

test.app.myFunc(); 
     ^
TypeError: undefined is not a function 
+0

Хорошо. Что такое 'app'? Я имею в виду, что у него есть? – thefourtheye

+0

@thefourtheye Я пытаюсь вызывать 'myFunc()' как-то. 'app' - это просто случайное имя, которое я взял. –

+0

App - это функция, вам нужно вызвать ее. –

ответ

1

в вашем примере myFunc является локальной переменной функции app, а не член, поэтому он не доступен, как app.myFunc (Вы не можете получить доступ к локальным членам функцию, в этом случае. Или вообще, если на то пошло). Если module.exports.app абсолютно должен быть функцией, а не, скажем, объект, вы можете сделать это:

module.exports = { 
    app: function() { 
    } 
}; 
module.exports.app.myFunc = function(arg) { 
    return 'working '+arg; 
}; 

Однако, было бы гораздо разумнее для app просто быть буквальным объект:

module.exports = { 
    app: { 
     myFunc: function(arg) { 
      return 'working '+arg; 
     } 
    } 
}; 

с другой стороны, если вам нужно myFunc зависеть от переменных внутренних к app (хотя это не должно быть необходимым, так как модули уже подразумевает инкапсуляцию):

module.exports = { 
    app: (function() { 
     var _internal = 'working '; 
     return { 
      myFunc: function(arg) { 
       return _internal+arg; 
      } 
     }; 
    })() 
}; 

Если вам нужно myFunc зависеть от параметров, передаваемых app:

module.exports = { 
    app: (function(passed) { 
     return { 
      myFunc: function(arg) { 
       return passed+arg; 
      } 
     }; 
    })() 
}; 

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

var test = require('./js/test.js'); 
console.log(test.app('working ').myFunc('now')); 

Это все варианты, которые я могу думать. Если это еще не ответит на ваш вопрос, это поможет, если вы объясните, что вы пытаетесь сделать немного лучше.

+0

Вы отлично ответили, спасибо! –

2

Вы должны сделать что-то вроде этого, чтобы работать:

module.exports = { 
    app: { 
     myFunc : function() { 
      console.log('working'); 
     } 
    } 
}; 

И тогда вы можете запустить его с этим:

var test = require('./js/test.js'); 
test.app.myFunc(); 
+0

Хорошо, извиняюсь, я обновил вопрос, чтобы показать лучший пример сейчас! –

0

Я не понимаю, в чем смысл усложнять код так много, но тем не менее, если вы хотите, чтобы усложнить его, кроме того, вы можете сделать это

module.exports = { 
    app: (function() { 
     var myFunc = function (arg) { 
      return 'working '+arg; 
     } 

     return {myFunc: myFunc} 
    }()) 
};  
+0

К сожалению, я пытаюсь создать существующий файловый модуль javascript.И он настаивает на использовании 'var myFunc()', не поймите меня неправильно, если бы я это написал, я бы сделал это правильно с самого начала, но автор только усложнил ситуацию. –

+0

@KarlMorrison Так почему же другой ответ не работает для вас? –

+0

В настоящее время он реализуется, когда мы говорим! –

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