新年快乐!
我正在看一个反应性的udemy教程(来自MaximillianSchwarzmüller的教程),那个家伙告诉我,我可以毫无问题地使用异步ES6函数.then(),因为“自从该代码将被编译为在旧版浏览器中也可以使用的代码”
现在我问自己,.then()被编译成什么,以便它也可以在较旧的浏览器中工作?
他是说是通过理解它的渲染引擎将其编译为某些C ++渲染内容,还是说它是通过Babel编译为更容易的普通JavaScript(如ES6箭头函数)的?
难道我也理解“编译”一词是错误的吗?我有点困惑。
非常感谢! :)
答案 0 :(得分:3)
.then()
被编译成什么,以便它也可以在较旧的浏览器中工作?
没什么不同。使用ES6 Promise的代码在语法上仍然是有效的ES5代码(假定它不使用其他ES6功能),与新语法(例如,箭头函数,类定义等)不同,它无需进行编译。
then
只是一个简单的方法调用(在ES5和ES6中),但是方法的定义由ES6环境提供。在开始使用诺言的ES5中,您需要包括一个诺言库(例如Q或Bluebird)。要使假定存在ES6 Promise
的代码在较旧的浏览器中运行,您需要一个 polyfill (例如,来自one of these列表)。 polyfill只是实现相同API的小型ES5脚本。
答案 1 :(得分:1)
编译(取决于定义)基本上是将一种语言的代码转换为另一种语言的代码-此过程有时也称为 translation 。您可以将C ++编译为本机代码,但也可以将Java中的代码编译为C ++或将一种语言版本的代码编译为另一种语言。这基本上就是JavaScript编译器的工作-他们将以较新版本的标准(例如ES6)编写的代码转换为较旧版本(例如ES5)。将一种语言版本的代码编译为另一种版本的编译器通常称为 transpiler 。
关于编译器将代码转换为什么:它取决于编译器,但是通常会在结果文件的开头注入某种类型的polyfill(基本上是内置功能的自定义实现) ,使缺少的功能可在您的所有代码库中使用。