2016-07-11 3 views
7

Dieser ES6 Code:Mit demselben Argument Namen als Standard-Parameter in ES6

const log =() => console.log('hi'); 
const parent = (log = log) => log(); 
parent(); 

Transpiled zu:

var log = function log() { 
    return console.log('hi'); 
}; 
var parent = function parent() { 
    var log = arguments.length <= 0 || arguments[0] === undefined ? log : arguments[0]; 
    return log(); 
}; 
parent(); 

gibt Fehler:

return log(); 
     ^
TypeError: log is not a function 

Das Problem ist diese Linie:

const parent = (log = log) => log(); 

Da der Argumentname identisch mit dem Standardparameter ist.

Dies funktioniert:

const log =() => console.log('hi'); 
const parent = (logNow = log) => logNow(); 
parent(); 

Ist das ein Fehler in Babel oder ist diese nicht in der Spezifikation selbst erlaubt?

+1

Hissen dieses Problem verursacht. –

Antwort

3

Scheint wie dies ist das erwartete Verhalten von ES6. Getestet auf der Chrome-Konsole, wurde ebenfalls ein Fehler angezeigt.

Die ES6 spec zu diesem Punkt zu sagen ist:

  1. Let parameterNames be the BoundNames of formals. http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiation

Das bedeutet, wenn Sie Funktion erstellen, wird ES6 das gleiche wie babel tut, ist im Grunde tut, wird es die Zuordnung der params im neuen Kontext verwalten .

In JavaScript aktiviert, wenn Sie eine Variable a in einem geschlossenen Rahmen schaffen, globale a, kann nicht mehr zugegriffen werden kann, da JS die a vom nächstmöglichen Umfang übernehmen, in AST.

Einfaches Beispiel:

var a = 1; 
function test() { 
    // creates the variable a, and try to assign a value to it, 
    // because `a` is now available in the scope itself, it will take value of a in the inner scope, not the outer scope one 
    var a = a; 
    console.log(a) 
} 
test() // undefined 

Warum sein nicht den Wert des Außen eine Aufnahme, und es dann mit dem inneren a zuweisen, ist wegen Hissen, im Grunde sein tut dies:

function test() { 
    var a; // the address for the variable is reserved at compile time 
    a = a; // run-time assignment 
} 

Es nimmt alle Variablendeklarationen einer Funktion und hoist es zum Anfang der Funktion.

Dies ist der Grund, warum so etwas wie dies funktioniert:

function hoistingTest(n, m = 2) { 
    // return immediately 
    return multi(n); 

    // This declaration will be hoisted to the begin of the body 
    function multi(n) { return m * n } 
} 
+0

Und Sie können nur den Originalcode in Chrome-Konsole kopieren und es wird sich verhalten, wie diese Antwort sagt, wenn Sie einen schnellen Beweis wollen –

Verwandte Themen