2013-03-05 3 views
7

Ist es absolut gültig, eine JavaScript-Funktion als Schlüssel in einem Objekt zu haben?Ist es absolut gültig, eine JavaScript-Funktion als Schlüssel in einem Objekt zu haben?

Die folgenden Werke, aber ich bin es nicht sicher ist 100% (ECMA oder was auch immer Körper diese regelt) konform

var f = function(){ 

}; 

var obj = {}; 

obj[f] = "a"; 


console.log(obj[f]); 
+3

Ich bin sehr gespannt auf einen praktischen Anwendungsfall dafür. –

+0

Ich würde sagen, es ist irgendwie sinnlos. Die Funktion verwendet wahrscheinlich toString, um einen Schlüssel von '[" function() {...} "]' – mplungjan

+1

zu erstellen, der das Verfolgen/Abmelden von anonymen Teilnehmerfunktionen in einem Pub/Subsystem führt. Nicht sicher, das ist die richtige Datenstruktur für den Job, obwohl –

Antwort

1

Es gibt Null Grund, das zu tun, da Objektschlüssel in ECMAscript darf nur Strings sein (vorläufig in ECMAscript 262 Ausgabe 3 und 5, nach Spezifikation).

Die Dinge werden sich jedoch in ECMAscript 6 ändern, wo wir WeakMaps und Objektschlüssel haben auch Objekte sein können (Ich bin über Funktion Referenzen nicht sicher).

Auch wenn ein Browser Objektschlüssel durch Funktionsreferenz im Augenblick unterscheiden kann, ist es definitiv fragwürdiges Verhalten, höchstwahrscheinlich experimentell und sollte jetzt nicht verwendet werden.

7

Es sieht so aus, als ob es funktioniert, aber es funktioniert möglicherweise nicht wie erwartet.

Die Funktion wird auf String gecastet, wenn als Schlüssel verwendet:

var f = function(a) { return a; }; 
var obj = {}; 
obj[f] = 'abc'; 
console.log(JSON.stringify(obj)); 
//"{"function (a) { return a; }":"abc"}" 
console.log(f.toString()); 
//"function (a) { return a; }" 
var f2 = function (a) { return a; }; 
console.log(obj[f2]); 
//"abc" 

So Funktionen f und f2 verschiedene Objekte sind, aber sie sind die gleichen, wenn bespannen gegossen.

+1

Obwohl, wenn 'f' und' f2' sich gleich verhalten, da der zugrunde liegende Code derselbe ist, ist dies oft kein Problem. –

+2

Es könnte sein, wenn sie Verschlüsse sind. Sie könnten denselben Quellcode haben, könnten von derselben äußeren Funktion erzeugt werden, aber sie würden an verschiedene Werte in den Schließungen gebunden sein. Also würden sie sich ** anders verhalten, aber gleich aussehen. – SWilk

1
var f = function(){ 

}; 
var obj = {}; 
obj[f] = "a"; 
console.log(obj['function(){\r\n\r\n}']); 
Verwandte Themen