网站设计 字体,免费版权申请入口,深圳福田网站制作公司,关于网站建设电话销售的话术引 在node.js中我们可以使用module.exports和exports导出模块#xff0c;设置导出函数、数组、变量等等 为什么可以用这两个模块#xff1f; 或者直接问#xff0c;node.js的模块功能是怎么实现的。 这样得益于javascript是函数性的语言#xff0c;并支持闭包。 js的闭包 直…引 在node.js中我们可以使用module.exports和exports导出模块设置导出函数、数组、变量等等 为什么可以用这两个模块 或者直接问node.js的模块功能是怎么实现的。 这样得益于javascript是函数性的语言并支持闭包。 js的闭包 直接看w3cschool吧感觉讲的挺好的js闭包 node.js的模块实现大致代码 首先准备一个nodejs规范的代码 hello.js var s Hello;
var name world;console.log(s name !); Node.js加载了hello.js后它把这段代码包装一下大概变成这样 var module {id: hello,exports: {}
};
var load function () {// 实际我们自己编写的hello.js代码:function greet(name) {console.log(Hello, name !);}module.exports greet;// hello.js代码结束return module.exports;
};
var exports load();
// 保存module:
save(module, exports); module是nodejs自动加的一个对象可见初始化的时候会先对module.exports赋值一个空的对象{}。 save(module, exports);这个函数是个真·全局函数作用是把exports这个变量存到某个全局变量中。其它模块通过require()函数实际上就是去这个全局变量里把对应的值拿出来。 这样看js代码大概就明白了为什么在nodejs里可以直接用module.exports和exports这两个语法。 module.exports和exports module.exports和exports实际上都是对一个对象的引用这个对象初始化就是一个空对象{}。所以直接就可以使用类似 示例一
module.exports.foo function () { return foo; };
module.exports.bar function () { return bar; };
或者示例二
exports.foo function () { return foo; };
exports.bar function () { return bar; }; 这两个示例作用是一样的其本质都是往最开始初始化的空数组里添加成员。 示例三
module.exports {hello: hello,greet: greet
}; 示例三就不一样了实际上module.exports重新引用到了一个新的对象里。如果示例三前面有示例一或者二的代码那么会最终导致示例一或者二导出的模块丢掉。 示例四
exports {hello: hello,greet: greet
}; 示例四看上去虽然和示例三差不多但是这种写法实际上并没有输出任何变量注意看nodejs的实现代码load()函数里最后return的是module.exports也就是说最后save的是module.exports的引用对象而示例四中exports被赋值了一个新的对象此时module.exports和exports引用的已经不是同一个对象了 那么提问示例三虽然对module.exports重新引用到了一个新的对象最终结果也能实现模块的正常导出那么示例三里的exports此时引用的是什么对象呢 最后如果你打算导出一个数组或者变量或者函数都会涉及到module.exports原引用对象的丢弃要额外注意此时要小心不要丢掉前面已经导出的模块。 结论 如果要输出一个键值对象{}可以利用exports这个已存在的空对象{}并继续在上面添加新的键值 如果要输出一个函数或数组必须直接对module.exports对象赋值。 所以我们可以得出结论直接对module.exports赋值可以应对任何情况 module.exports {foo: function () { return foo; }
};
或者
module.exports function () { return foo; }; 最终我们强烈建议使用module.exports xxx的方式来输出模块变量这样你只需要记忆一种方法。 或者使用我喜欢的方法,对空对象直接添加值 var foo function () { return foo; };...module.exports.foo foo;//
module.exports.bar function () { return bar; }; 参考 liaoxuefeng exports 和 module.exports 的区别 w3cschool JS是按值传递还是按引用传递?但是我不是很同意文中所说的按共享传递这名字的叫法。实际上无论传递普通变量还是传递函数都是按值拷贝传递只不过传递对象的时候拷贝过去的是个引用变量罢了即引用副本。 这里就是c语言指针的思想。 如果你对我上面所讲的还不明白建议去把c语言里的指针好好的重学一遍。真正理解透彻了c里面的指针学起来其它所有语言都不怕。 转载于:https://www.cnblogs.com/acbingo/p/7709363.html