未定义不是函数:模块导出

时间:2015-04-05 12:14:44

标签: javascript

尝试创建一个小模块导出。我要求var myFunc() = function()...完好无损,我试图制作模块的代码非常复杂。

这是文件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

3 个答案:

答案 0 :(得分:2)

你应该做这样的工作:

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

然后你可以用它运行它:

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

答案 1 :(得分:2)

在您的示例中,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'));

这是我能想到的所有选择。如果这仍然没有回答你的问题,那么如果你解释一下你想要做得更好的话会有所帮助。

答案 2 :(得分:0)

我不明白将代码复杂化的重点是什么,但是如果你想让它复杂化,你可以做到这一点

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

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