Есть ли полифилл для стрелочной функции 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)


arrow_upward
16
arrow_downward

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

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

arrow_upward
14
arrow_downward

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

person Chris Cousins    schedule 22.09.2017

arrow_upward
0
arrow_downward

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

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

person PeterMader    schedule 22.09.2017

arrow_upward
0
arrow_downward

Я довольно зеленый с 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