是否有适用于ES6箭头函数的polyfill?

26

是否有一个用于 ES6 箭头函数的 polyfill

在 IE 中,以下代码会抛出语法错误异常,是否有一个 polyfill 可以使 IE 支持箭头函数?

var myFunc = ()=>{
    alert('es6');
}
myFunc();

注意: 我不想使用任何 转译器

先行致谢。


2
此类功能无法进行兼容性填充。 - dfsq
转译器存在的原因是解决填充无法解决的问题。避免使用它们的动机是什么? - loganfsmyth
我有一段现有的代码(分散在企业应用程序中),由许多开发人员创建/更改。因此,我希望无缝地允许开发人员使用ES6功能。 - Rana
4个回答

16

一个 polyfill 可以添加或修复缺失的内置类、函数、对象...但它不能修改编译器接受的语法。


2
类也是新语法 ;) - Felix Kling
我不同意,创建新变量并不是添加新语法。 - Pablo Lozano
1
不支持类的浏览器无法解析class Foo {}。但是现在我重新阅读了这篇文章,我猜你是指添加内置类的功能(虽然我不确定是否有任何内置类)?总的来说,我认为简单地说填充可以添加/修复API会更少令人困惑。 - Felix Kling
我所说的类并不是指类糖语法,而是像Promise这样添加新类。 - Pablo Lozano

14

箭头函数没有 polyfill。如果您不使用转换器,那么编写此代码就是语法错误。


0

我对JS还不是很熟悉,所以我觉得这可能不能算作是一个polyfill...但它似乎是个'管道胶带'的权宜之计。我发现由Luis Perez制作的 fiddle提供了这个功能。我仍在努力更好地理解箭头函数,但它至少可以与MDN箭头函数示例之一一起工作。这是我在玩弄之后设法理解的片段(至少更好了),希望它对某人有用。

var str = [
  'Hydrogen',
  'Helium',
  'Lithium',
  'Beryllium'
];

var g_arrowCache = Object.create(null);
function arrow(expression) {
  function cache(cache, key, getValueFunc) {
    var value = cache[key];
    
    if(value === undefined) {
        value = getValueFunc(key);
        cache[key] = value;
    }
    return value;
  }
  
  function arrowImpl(expression) {
    // This function is a polyfill for proposed "arrow functions" in JavaScript.
    // Example:  str.map(_$("str => str.length"))
    
    if (expression.search(/\bthis\b/) != -1) throw "'this' not supported";
    
    var indexOfArrow = expression.indexOf("=>");
    if(indexOfArrow == -1) throw "Expressio is missing the arrow operator =>";
    var parametersString = expression.substring(0, indexOfArrow);
    
    parametersString = parametersString.replace("(", "").replace(")", "");
    
    var parameters = parametersString.split(",");
    parameters.map(function(o) { return o.trim(); });
    
    var functionBody = expression.substring(indexOfArrow + 2);
    
    if(expression.indexOf("{") != -1) throw "Use of curly brackets for multiple statements not supported or recommended.";
    if(expression.indexOf("}") != -1) throw "Use of curly brackets for multiple statements not supported or recommended.";
    
    functionBody = "return " + functionBody.trim() + ";";
    var args = parameters.slice(0);
    args.push(functionBody);
    var func = Function.constructor.apply(null, args);
    return func;
  }
  return cache(g_arrowCache, expression, arrowImpl);
}
var _$ = arrow;
console.log(str.map(_$("str => str.length")));


0

添加新语法的特性无法进行 polyfill。

我只能想到 babel-standalone,你可以把它看作是一个即时编译器/转译器(如果你接受的话)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接