2016-09-17 4 views
1

Der unter Schnipsel wirft unerwartetes Token in Zeile: b: Funktion (func, data1) https://jsbin.com/qobicahica/edit?html,js,outputWarum dieses Snippet ein unerwartetes Token auslöst?

var Funcb = (function() 
{ 
return 
{ 
    b: function (func, data1) 
    { 
     alert(1); 
    } 
}; 
    })(); 

Funcb.b(1,1); 

Aber ein ähnliches Beispiel in folgenden Tutorial funktioniert:

https://toddmotto.com/everything-you-wanted-to-know-about-javascript-scope/

// define module 
    var Module = (function() { 
    return { 
    myMethod: function() { 
     console.log('myMethod has been called.'); 
    } 
    }; 
})(); 

// call module + methods 
Module.myMethod(); 

EDIT: Funktioniert nach dem Entfernen Zeilenumbrüche nach der Rückkehr, aber warum? Wenn Javascript so nachsichtig und lose typisiert ist, warum dann wird diese nicht außer Acht gelassen:

var Funcb = (function() 
    { 
    return{ 
     b: function (func, data1) 
     { 
      alert(1); 
     } 
    }; 
     })(); 
+0

https://jsfiddle.net/L01k684r/ – guest271314

Antwort

2

Das Problem ist in der dritten Zeile, ein Semikolon wird nach der Return-Anweisung eingefügt. Siehe rules for JS automatic semicolon insertion.

Entfernen Sie das Newline-Zeichen nach return und es sollte funktionieren.

var Funcb = (function() { 
    return { 
     b: function (func, data1) { 
      alert(1); 
     } 
    }; 
})(); 

Funcb.b(1,1); 

Um Ihre EDIT finden Sie auf Seite 28 des specs zu beantworten.

return; 
a+b; 

+ Der Ausdruck a b wird nicht als ein Wert behandelt durch die Rückkehr zurückgeführt werden:

Die Quelle

return 
a+b 

wird durch automatisches Strich Einsetzen in die folgenden umgewandelt Anweisung, weil ein LineTerminator sie von der Token-Rückgabe trennt.

1

Ihre return-Anweisung etwas enthalten sollte. Die geschweifte Klammer befindet sich in der nächsten Zeile und sollte neben der return-Anweisung stehen. Dies gibt den unerwarteten Token-Fehler.

var Funcb = (function() { 
    return { 
     b: function (func, data1) { 
      alert(1); 
     } 
    }; 
})(); 
Funcb.b(1,1); 
+0

Danke für die Überprüfung. Nach dem Posten gefunden, bearbeitet die Frage. Wenn JavaScript so fehlerverzeihend und locker typisiert ist, warum wird das dann nicht ignoriert? – Stacky

+1

Da in Ihrem Beispiel die Funktion null (eine leere return-Anweisung) zurückgibt, versucht der Parser, das Objekt {b: func ..} auszuwerten, das nicht zugewiesen ist. –