web-dev-qa-db-ja.com

ES6矢印関数のポリフィルはありますか?

ES6矢印関数にpolyfillがありますか?

次のコードはIEで構文エラー例外をスローします。作成するpolyfillがありますIEサポート矢印関数?

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

transpilerは使用しません。

前もって感謝します

16
Rana

ポリフィルは、欠落している組み込みクラス、関数、オブジェクトを追加または修正できますが、コンパイラの受け入れられた構文を変更することはできません。

8
Pablo Lozano

矢印関数にはポリフィルはありません。トランスパイラーを使用しない限り、持っているコードを記述するのは構文エラーです。

8
Chris Cousins

私は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")));
0
Cecell

新しい構文を追加する機能はポリフィルできません。

babel-standalone しか考えられません。これは、JITコンパイラ/トランスパイラと考えることができます(それで問題なければ)。

0
PeterMader