2015-06-24 24 views
6

Dato che nessun browser So che implementa l'interfaccia attualmente moduli ES6 - ma transpilers do - ho provato babel con questo semplice esempiodivertente importazione di Babel

import { getUsefulContents } from "file.js"; 
getUsefulContents("http://www.example.com", data => { 
    doSomethingUseful(data); 
    }); 

Volevo solo vedere come ci si transpile queste righe. Con mia grande sorpresa ha prodotto output seguente:

"use strict"; 

var _fileJs = require("file.js"); 

(0, _fileJs.getUsefulContents)("http://www.example.com", function (data) { 
    doSomethingUseful(data); 
}); 

L'ultima riga sembra misterioso per me - soprattutto la parte (0, _fileJs.getUsefulContents), quello che sta succedendo lì? Qual è lo scopo di quello (0, ...) su quella linea?

risposta

9

Chiamare una funzione del genere lo costringe a chiamarlo nel contesto globale.

function whoAmI() { 
 
    document.querySelector('pre').innerText += this.name + '\n'; 
 
} 
 
window.name = 'window'; 
 
var mike = { 
 
    name: 'mike', 
 
    whoAmI: whoAmI 
 
}; 
 
mike.whoAmI(); 
 
(0, mike.whoAmI)();
<pre></pre>

Il motivo per cui funziona è perché quando si valuta (0, filesJs) corre attraverso ciascuna delle dichiarazioni in parentesi, in modo simile a come si può dichiarare più variabili utilizzando un ,

var a = 1, 
    b = 2, 
    ... 

Poiché l'ultima espressione fa riferimento a una funzione, la utilizza durante la valutazione della chiamata di funzione con il successivo insieme di parentesi. Essendo che l'espressione è stata già valutata, il contesto _filesJs viene perso. E 'effettivamente la stessa come fare questo:

0; // Legal, just pointless 
var f = _filesJs.getUsefulContents; 
f("http://example.com", ...); 
+0

wow, che bello :) - grazie per la risposta, buono a sapersi –

+1

Non funziona in ' 'use strict';' modalità. –

+0

@NinaScholz buon punto e il motivo per cui è stato utilizzato è per me ancora poco chiaro –

Problemi correlati