2017-03-12 1 views
0

Ich habe die Function gelesen. So versuche ich Funktionserklärung in Funktion Ausdruck von neue Funktion zu transformieren. Aber bin ich in der unten stehenden Code stecken:Gibt es einen Fehler in der neuen Funktion?

function Foo(name, age) { 
    Foo.prototype.name = name; 
    Foo.prototype.age = age; 
} 
var foo = new Foo(1,2); // this is ok 
console.log(Foo.prototype.hasOwnProperty('name')); 
console.log(foo.hasOwnProperty('name')); 

Allerdings gibt es einen Fehler nach der Transformation:

var Foo = new Function(['name', 'age'], 'Foo.prototype.name=name;Foo.prototype.age=age;'); 
 
var foo = new Foo(1,2); // error: Foo is not defined 
 
console.log(Foo.prototype.hasOwnProperty('name')); 
 
console.log(foo.hasOwnProperty('name'));

Gibt es einen Fehler? Jede Antwort ist hilfreich.

Der Code ist in meinem Chrom-Browser richtig. Allerdings macht es einen Fehler auf der Plattform:

  • NodeJS: 6.10.0
  • win7 64bit
+0

Sie können Foo anmelden und sehen, ob es eine Funktion ist – CaptainHere

+0

Warum möchten Sie das tun? – Pointy

+0

Nichts von dem, was Sie geschrieben haben, ergibt einen Sinn ... –

Antwort

1

Der Fehler ist, weil var Foo nicht definiert ist, wo die Function es erreichen können, zumindest nicht während Knoten verwenden.

Wenn Sie mithilfe des Konstruktors new Function() eine Funktion aus einer Zeichenfolge erstellen, hat die Funktion nur Zugriff auf den globalen Bereich, unabhängig davon, wo er erstellt wurde.

Und wenn innerhalb eines Knotenmoduls var Foo und var foo keine globalen Variablen sind. Sie sind lokale Variablen, die nur innerhalb der aktuellen Datei/des aktuellen Moduls innerhalb eines "Modul" -Bereichs existieren.

var bar = 'bar'; 
console.log(bar);  // function 
console.log(global.bar); // undefined 

Um die new Function() zu erlauben Foo, zugreifen Sie diese als eine globale Variable definieren müssen (oder eine Eigenschaft des global Objekt).

global.Foo = new Function(['name', 'age'], 'Foo.prototype.name=name;Foo.prototype.age=age;'); 
var foo = new Foo(1,2); 
// ... 

Though, you should be aware that modifying the global scope/object like this is generally frowned upon in Node, since this goes against its intent/design of using isolated modules.


Obwohl die Funktion von einem Ausdruck zu definieren, brauchen Sie nicht den Function Konstruktor zu verwenden. Sie können stattdessen place the declaration where an Expression is expected, wie nach einem Zuweisungsoperator.

var Foo = function (name, age) { 
    Foo.prototype.name = name; 
    Foo.prototype.age = age; 
}; 
var foo = new Foo(1,2); // this is ok 
// ... 
Verwandte Themen