2016-02-23 10 views
5

Dlaczego Babel dodaje następujący wiersz kodu podczas transponowania mojego javascript z ES5 na ES2015?Transpel Babel ponownie przypisuje argumenty do _arguments

var _arguments = arguments; 

Ta linia łamie funkcjonalność w moim kodzie, która odnosi się do argumentów ... Jakieś pomysły?

Funkcja, która łamie, po prostu trwa jeden ciąg, 'słowo' i concats go do następnego argumentu przekazanego w:

concatWordsExample: word => { 
    let wordAndFirstArg = word + arguments ? arguments[0] : ''; 
} 

Przykład wywołania funkcji:

concatWordsExample('firstword ', 'secondword'); 
// I expected wordAndFirstArg to be 'firstword secondword'; 

używam Babel v6.0.0 via Grunt

Odpowiedz

7

Problem polegał na tym, że użyłem "argumentów" (składnia ES5) w ArrowFunction w moim przykładzie:

concatWordsExample: word => { 
    let wordAndFirstArg = word + arguments ? arguments[0] : ''; 
} 

Argumenty w tym wypadku nie odnosi się do argumentów funkcji strzałka, która jest, co wanted- „Wszelkie odniesienia do argumentów, super, czy to w ramach ArrowFunction są zdecydowane ich powiązań w leksykalnie obejmująca funkcję. " Stąd mogę ponownie napisać do tradycyjnej funkcji, choć lepszym rozwiązaniem było po prostu użyć nowego „odpoczynek argumentów” składni ES2015 zamiast, na przykład:

concatWordsExample: (word, ...args) => { 
    let wordAndFirstArg = word + args ? args[0] : ''; 
} 

Oto oficjalny krótką informację od Babel:

„Wszelkie odniesienia do argumentów, super, czy to w ramach ArrowFunction są zdecydowane ich powiązań w funkcji leksykalnie osłaniającego. Mimo ArrowFunction może zawierać odnośniki Super, obiekt funkcja utworzony w kroku 4 nie jest przekształcono w metodę, wykonując MakeMethod. ArrowFunction która odwołuje SUPER to zawsze zawarte w nie- ArrowFunction i stanu niezbędnego do wdrożenia SUPER dojechać zakresuże jest przechwycony przez obiekt funkcji w ArrowFunction.”

+1

Proszę umieść pierwszy fragment kodu i otaczającą funkcję w twoim pytaniu.Nie ma to większego znaczenia, jak jest. Proponuję również zastąpić _ "To nie jest poprawne w ES2015" _ z czymś takim jak "argumenty w tym przypadku nie odnoszą się do argumentów funkcji strzałek, czego właśnie chciałem. "_ Z samego kodu nie możemy wywnioskować, że tego chciałeś – zeroflagL

+0

Dzięki, dodałem :) –