我在这里看:
https://github.com/gf3/Levenshtein/blob/master/lib/levenshtein.js
我看到代码的开头是这样的:
(function(root, factory){
if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
define(function(){
return factory(root);
});
} else if (typeof module == 'object' && module && module.exports) {
module.exports = factory(root);
} else {
root.Levenshtein = factory(root);
}
}(this, function(root){
我以前从未见过这个。这是什么意思?什么" root"意思?
如果我将它添加到我的NodeJS应用程序的package.json文件中,那么我该如何使用这个内部函数:
// Levenshtein distance
function Levenshtein( str_m, str_n )
所有示例都使用此内部函数,但我不知道如何实现它。
答案 0 :(得分:0)
" root"意思?
root
是传递给此IIFE的第一个参数,(如第11行所示)是this
。在顶级" Node.js中的JavaScript文件,this
指向the global
namespace object。在浏览器中,它指向window
。
所有示例都使用此内部函数,但我不知道如何访问它。
这不是问题,但这是你在Node.js中使用它的方式:
const Levenshtein = require('levenshtein');
const lev = new Levenshtein('bar', 'baz');
console.log(lev.distance); // => 1
这是什么意思?
所有这一切的目的是使这个代码工作,无论您在Node.js中使用require
,在浏览器中使用AMD模块加载器还是<script>
标记。
如果你将其分解,那么代码就太难理解了。让我们从第11行的匿名function
开始,这是一个&#34;工厂&#34;只返回Levenshtein
构造函数的函数,如下所示:
function factory(root) {
// ...
function Levenshtein( str_m, str_n ) {
// ...
}
// ...
return Levenshtein
}
(在Levenshtein模块的情况下,root
参数实际上从未在&#34;工厂&#34;函数中使用。去图。)
现在让我们回到第一行。这里声明了一个匿名的function
,其基本上是这样的:
function iife(root, factory) {
const Levenshtein = factory(root);
if (anAMDLoaderIsLoadingMe()) {
// AMD loaders supply a `define` function
define(function() { return Levenshtein; });
} else if (nodeJsIsLoadingMe()) {
// Node.js supplies the `module.exports` object
module.exports = Levenshtein;
} else {
// In a browser, so `root` is `window`
root.Levenshtein = Levenshtein;
}
}
最后,这两个函数的使用方式如下:
iife(this, factory);
那就是它!这些函数被匿名使用而不是给它们iife
和factory
等合理名称的原因是它们不会与您可能定义的其他函数(或其他不太好的函数)发生冲突表现模块定义)。这在Node.js中是不可能的,但它在浏览器中。