Con la mia comprensione limitata di RequireJS e Node.js (più JavaScript in generale), di solito guardo all'origine di alcune librerie JavaScript note. Ogni volta che vedo qualcosa di simile:Perché questo codice JavaScript (modello di modulo per RequireJS e Node.js) funziona?
(// Wrapping
function (root, factory) {
if (typeof exports === 'object') { // Node.js
var underscore = require('underscore');
var backbone = require('backbone');
module.exports = factory(underscore, backbone);
} else if (typeof define === 'function' && define.amd) { // Require.JS
define(['underscore', 'backbone'], factory);
}
}(this, function (_, Backbone) { // Factory function, the implementation
"option strict";
function Foo() {}
return Foo; // Export the constructor
})
); // Wrapping
Cosa posso capire (si spera):
- La funzione anonima che avvolge il codice viene eseguito automaticamente quando lo script è uncluded in un tag
<script>
- Questo codice funziona con entrambi i requisiti RequireJS e Node.js (
if
all'inizio); il risultato della funzionefactory
è assegnato amodule.exports
(Node.js) o utilizzato come argomento della funzionedefine
(RequireJS).
Q1: come funziona questo codice senza RequireJS e Node.js? I controlli if
e else if
non funzionerebbero, la funzione factory
non viene mai eseguita e gli script restituiscono nothig.
Q2: qual è lo scopo di passare this
come argomento root
? Non è mai usato
Sei sicuro che funzioni senza RequireJS o Node.js? La mia comprensione limitata di JavaScript (e questo forse errato) [JSFiddle] (http://jsfiddle.net/aM3ZT/) mi fa pensare che non puoi accedere a Foo() –
@nekman Ahh, vedo che presuppone almeno Backbone è disponibile . È intelligente –
@JasonSperske non è sicuro al 100%, ma guarda la risposta di nekman ... – gremo