Javascript——在Node.js与浏览器中导出
我正试图从模块部分中雄辩的Javascript运行这个简短的程序Javascript——在Node.js与浏览器中导出,javascript,node.js,Javascript,Node.js,我正试图从模块部分中雄辩的Javascript运行这个简短的程序 var weekDay = function() {}(); (function(exports) { var names = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; exports.name = function(number) { return names[number]; }
var weekDay = function() {}();
(function(exports) {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"];
exports.name = function(number) {
return names[number];
};
exports.number = function(name) {
return names.indexOf(name);
};
})(this.weekDay = {});
console.log(weekDay.name(weekDay.number("Saturday")));
正确的输出应该是/->星期六
它在浏览器中工作得非常好。但是,当我尝试在节点解释器中运行它时,会出现以下错误:
TypeError: Cannot read property 'name' of undefined
我只能假设它与Node处理exports关键字的方式有关。有人能帮我至少大致了解一下这种行为吗?在node.js这一行:
var weekDay = function() {}();
只生成一个未定义的变量weekDay,因为它所做的只是定义一个带有空主体的函数(代码中的{}
),然后立即运行它。因为主体是空的(最重要的是,没有返回语句),所以它产生未定义的结果
实现您想要的方法是将整个定义放在此函数中,并定义要公开的内容,如下所示:
var weekDay = function() {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"];
var name = function(number) {
return names[number];
};
var number = function(name) {
return names.indexOf(name);
};
return {
number: number,
name: name
}
}();
console.log(weekDay.name(weekDay.number("Saturday")));
将第一行更改为
var weekDay={}代码>当你调用你的iLife时,只需在工作日将你在第一行中创建的内容放入其中。Nir Levy的答案是正确的,但我也发布了这个答案,因为你在谈论模块。这就是如何为代码片段创建模块的方法
//create your module like this and put this module in a separate file (ex. weekDay.js)
var weekDay = (function() {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var name = function(number) {
return names[number];
};
var number = function(name) {
return names.indexOf(name);
};
return {
number: number,
name: name
}
})(); //it's a self executing function
//exporte module
module.exports = weekDay
//to get your module (in another file)
var weekDayModule = require('./weekDay'); //path to module
console.log(weekDayModule.name(weekDayModule.number('Saturday')));
可能是这个。工作日。试着把它改为工作日,第一行也没用。只需在工作日保持var
。在节点模块中,此
不是全局
,而是导出
@AlexanderO'Mara,您介意澄清一下这一点吗?在节点模块中,此
是由节点预定义的导出
对象。如果不清楚,请随时询问更多信息;)这个解决方案实际上或多或少是书中使用的原始工作示例。Haverbeke对我写的另一个版本这样说:“对于更大的模块,在函数末尾将所有导出的值收集到一个对象中会变得很尴尬,因为许多导出的函数可能很大,而您更愿意将它们写到其他地方。一个方便的替代方法是声明一个对象(通常称为导出)并在定义需要导出的内容时向其添加属性。“@ooronning:检查我的答案,这是在单独文件中导出模块的常用方法