由于我所知道的浏览器当前没有实现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, ...)
的目的是什么?
答案 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", ...);