TL; DR
Что означает "корень" означает?
root
является первым аргументом, переданный в IIFE, который (как вы видите на линии 11) this
. На «верхнем уровне» файла JavaScript в Node.js, this
указывает на the global
namespace object. В браузере он указывает на window
.
Все примеры используют эту внутреннюю функцию, но я не знаю, как ее достичь.
Это не вопрос, но это то, как вы используете его в Node.js:
const Levenshtein = require('levenshtein');
const lev = new Levenshtein('bar', 'baz');
console.log(lev.distance); // => 1
Что это значит?
Целью всего этого является то, чтобы сделать этот код работать Используете ли вы require
в Node.js, модуль загрузчика AMD или <script>
тега в браузере.
Если вы сломаете это, код не слишком сложно понять. Давайте начнем с анонимным function
на линии 11, которая является функцией «завод», который просто возвращает Levenshtein
конструктор, например, так:
function factory(root) {
// ...
function Levenshtein(str_m, str_n) {
// ...
}
// ...
return Levenshtein
}
(В случае модуля Левенштейн, то root
аргумент в действительности никогда не используется в функции «фабрика».).
Теперь давайте вернемся к первой строке. Здесь анонимный 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, но оно находится в браузере.
Возможный дубликат [Что такое 'typeof define ===' function '&& define \ [' amd '\]' для использования?] (Http://stackoverflow.com/questions/30953589/what-is-typeof -define-function-defineamd-used-for) –
Просто используйте его, как обычно. Вы можете заметить, что он обычно выполняет 'module.exports', если обнаруживает, что он запущен в node.js (существует объект модуля) – slebetman