2017-01-23 4 views
2

ich this book on ES6 Lesen und es ist die folgende:Warum funktioniert als Block beschrieben sind scoped

Function declarations…

  • are block-scoped, like let.
  • create properties in the global object (while in global scope), like var.
  • are hoisted: independently of where a function declaration is mentioned in its scope, it is always created at the beginning of the scope.

AFAIK, haben Funktionen immer Funktion scoped. Ich dachte, etwas könnte in ES6 geändert haben, aber nein:

function a() { 
    if (true) { 
     // defined inside the block and is hoisted to the top of that block 
     z(); 
     function z() { console.log ('z')} 
    } 

    z(); 
} 

// but is also hoisted to the function scope 
a(); // works OK 

Eigentlich scheinen sie Block scoped werden:

function a() { 
    if (false) { 
     // defined inside the block and is hoisted to the top of that block 
     z(); 
     function z() { console.log ('z')} 
    } 

    z(); // error 
} 

So verändert hat es in ES6?

+0

Ich denke, dass das Buch die (vorhandene) Funktionsdeklaration als Beispiel verwendet, um zu erklären, wie 'let' in das Bild passt. – Lucero

+1

Das liegt daran, dass Sie es im lockeren Modus ausführen. Im strikten Modus sollte es wie erwartet sein. – estus

Antwort

5

AFAIK, functions have always been function scoped. I thought something might have changed in ES6

Es tat: Vor ES2015 umfasste die Spezifikation nicht Funktionen, die innerhalb von Blöcken überhaupt deklariert wurden. Sie zu unterstützen war eine erlaubte Erweiterung, aber nicht Teil der Spezifikation.

Als Ergebnis muss die Spezifikation durch die Sprünge springen, insbesondere im lockeren Modus auf Browsern.

In strengen-Modus können Sie auf einem konformen Motor finden, die Erklärungen sind in der Tat funktioniert Block-scoped:

"use strict"; 
 

 
function test() { 
 
    if (true) { 
 
    function foo() { 
 
     console.log("foo called"); 
 
    } 
 
    } 
 
    try { 
 
    foo(); // ReferenceError 
 
    } catch (e) { 
 
    console.log("Error: " + String(e)); 
 
    } 
 
} 
 
test();

Auf einer konforme JavaScript-Engine (wie V8 in jede neuere Version von Chrome oder SpiderMonkey in einer aktuellen Version von Firefox), erhalten Sie eine ReferenceError auf die oben genannten.

+0

@TJCrowder Auf Firefox bekomme ich diese SyntaxError: im strikten Modus Code, Funktionen können nur auf oberster Ebene oder sofort innerhalb einer anderen Funktion erklärt werden – Eineki

+0

@Eineki: Das muss eine ziemlich alte Version von Firefox sein ("alt" ist eine ziemlich relative Begriff im ES2015-Unterstützungsland :-)). Ich bekomme den erwarteten 'ReferenceError' in Firefox v50.1.0. –

Verwandte Themen