巴贝尔有趣的导入

时间:2015-06-24 19:07:49

标签: javascript babeljs

由于我所知道的浏览器当前没有实现ES6模块接口 - 但是转发器确实如此 - 我用这个简单的例子测试了babel

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

我只是想看看它是如何改变这些界限的。令我惊讶的是它产生了以下输出:

"use strict";

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

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

最后一行对我来说很神秘 - 特别是(0, _fileJs.getUsefulContents)部分,那里发生了什么?那条(0, ...)的目的是什么?

1 个答案:

答案 0 :(得分:9)

调用这样的函数会强制它在全局上下文中调用它。

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>

这样做的原因是因为当它评估(0, filesJs)时,它会遍历括号中的每个语句,类似于使用,

声明多个变量的方式
var a = 1,
    b = 2,
    ...

由于最后一个表达式是对函数的引用,它在使用下一组括号计算函数调用时使用它。由于表达式已经被评估,_filesJs上下文丢失了。它实际上与执行此操作相同:

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