Есть ли полифилл для стрелочной функции es6?

Есть ли функция стрелки polyfill для es6?

следующий код вызывает исключение синтаксической ошибки в IE, есть ли polyfill, чтобы IE поддерживал стрелочные функции?

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

Примечание: я не хочу использовать transpiler.

заранее спасибо


person Rana    schedule 22.09.2017    source источник
comment
Этот тип функций не может быть polifilled.   -  person dfsq    schedule 22.09.2017
comment
Транспиляторы существуют для того, чтобы решать проблемы, с которыми не могут справиться полифилы. Какова мотивация их избегания?   -  person loganfsmyth    schedule 23.09.2017
comment
У меня есть существующий код (распространенный по всему корпоративному приложению), который создается/изменяется многими моими разработчиками. Поэтому я хочу беспрепятственно позволить разработчикам использовать функциональные возможности es6.   -  person Rana    schedule 25.09.2017


Ответы (4)


Полифилл может добавлять или исправлять отсутствующие встроенные классы, функции, объекты... но он не может изменять принятый компилятором синтаксис.

person Pablo Lozano    schedule 22.09.2017
comment
Классы также являются новым синтаксисом;) - person Felix Kling; 22.09.2017
comment
Я не согласен, создание новых переменных не добавляет новый синтаксис - person Pablo Lozano; 22.09.2017
comment
class Foo {} не могут быть проанализированы браузерами, которые не поддерживают классы. Но теперь, когда я перечитал пост, я думаю, вы имели в виду добавление функциональности встроенных классов (хотя я не уверен, есть ли они)? В общем, я думаю, что просто сказать, что полифиллы могут добавлять/исправлять API, не так сложно. - person Felix Kling; 22.09.2017
comment
Под классами я имел в виду не синтаксис сахара класса, а добавление новых классов типа Promise, например - person Pablo Lozano; 22.09.2017

Для стрелочных функций нет полифилла. Это синтаксическая ошибка писать код, который у вас есть, если вы не используете транспилятор.

person Chris Cousins    schedule 22.09.2017

Функции, добавляющие новый синтаксис, не могут быть полифилами.

Я могу думать только о babel-standalone, который вы можете подумайте о JIT-компиляторе/транспиляторе (если это вас устраивает).

person PeterMader    schedule 22.09.2017

Я довольно зеленый с JS, поэтому у меня есть ощущение, что это может не квалифицироваться как полифилл... но, похоже, это временная мера "клейкой ленты". Я нашел скрипку, сделанную Luis Perez, который предоставляет эту функциональность. Я все еще работаю над тем, чтобы лучше понять функции стрелок, но, по крайней мере, они работают с одной из примеры стрелочных функций 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")));

person Cecell    schedule 02.12.2017