Nein, Sie können eine solche Funktion nicht erzeugen. Das Problem ist, dass dies:
any_function(undeclared_variable)
eine Reference produzieren, wenn undeclared_variable
nirgendwo erklärt wurde. Zum Beispiel, wenn Sie diesen Stand-alone-Code ausführen:
function f() { }
f(pancakes);
es eine Reference bekommen, weil pancakes
nirgendwo erklärt wurde. Demo: http://jsfiddle.net/ambiguous/wSZaL/
Allerdings kann die typeof
operator auf etwas verwendet werden, die dies so nicht deklariert wurde:
console.log(typeof pancakes);
wird einfach eine undefined
in der Konsole anmelden. Demo: http://jsfiddle.net/ambiguous/et2Nv/
Wenn Sie nicht möglich ReferenceErrors nichts dagegen haben, dann haben Sie bereits die notwendige Funktion in Ihrer Frage:
function exists(obj, key) {
if (typeof obj !== "undefined" && obj !== null)
return obj[key];
return null; // Maybe you'd want undefined instead
}
oder, da Sie müssen typeof
auf nicht deklarierte Variablen nicht in der Lage zu verwenden, hier können Sie es vereinfachen bis:
function exists(obj, key) {
if(obj != null)
return obj[key];
return null;
}
Beachten Sie die Änderung !=
ist undefined == null
gilt, obwohl undefined === null
nicht.
für diesen einen Mehrzweck-Getter benötigen würde ('definegetter (o, Funktion (Eigentum) {...})', die sind, wenn ich Correclty erinnern, das nicht Teil der Spezifikation von JavaScript. – Zeta
@Zeta Nicht in der Tat, da der Zugriff auf eine nicht existierende Eigenschaft eines Objekts 'undefined' zurückgibt, anstatt zu versagen, was gut genug sein sollte. – millimoose
Der nächste, den ich mir vorstellen kann, ist 'function exists (obj) {if (obj) return obj; return {}; } ', aber das wird nicht mit undefinierten Variablen umgehen Javascript ist nicht syntaktisch so erweiterbar – millimoose