Babel 的有趣导入
Babel's funny import
因为我知道目前没有浏览器实现 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, ...)
的目的是什么?
调用这样的函数会强制它在全局上下文中调用它。
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", ...);
因为我知道目前没有浏览器实现 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, ...)
的目的是什么?
调用这样的函数会强制它在全局上下文中调用它。
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", ...);