2013-03-05 5 views
7

Czy jest całkowicie prawidłowe posiadanie funkcji javascript jako klucza w obiekcie?Czy jest całkowicie prawidłowe posiadanie funkcji javascript jako klucza w obiekcie?

następujące prace, ale nie jestem pewien, że to jest 100% (ECMA lub cokolwiek organizm reguluje tego) zgodny

var f = function(){ 

}; 

var obj = {}; 

obj[f] = "a"; 


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

Jestem bardzo ciekawy, aby zobaczyć praktyczny przypadek do tego. –

+0

Powiedziałbym, że to bezsensowne. funkcja najprawdopodobniej używa toString do utworzenia klucza '[" function() {...} "]' – mplungjan

+1

śledzenie/deregistering anonimowych funkcji subskrybenta w pubie/podukładzie. Nie jestem pewien, czy jest to odpowiednia struktura danych dla zadania, ale –

Odpowiedz

1

Jest zerowy powód, aby to zrobić, ponieważ obiektów kluczy w ECMAscript może być tylko ciągi (na razie w ECMAscript 262 wydanie 3 i 5, według specyfikacji).

Co zmieni się jednak w ECMAscript 6, gdzie będziemy mieli WeakMaps i klucze obiektów można także obiekty (nie jestem pewien o odniesień funkcyjnych).

Nawet jeśli przeglądarka może teraz rozróżniać klucze obiektów przez odniesienie funkcji, jest to zdecydowanie wątpliwe zachowanie, najprawdopodobniej eksperymentalne i nie powinno być używane w tej chwili.

7

Wygląda tak, jak działa, ale może nie działać zgodnie z oczekiwaniami.

Funkcję lanego ciąg stosowany jako klucz:

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" 

więc funkcje F i F2 są różne przedmioty, ale są one takie same, gdy lanego do łańcucha.

+1

Chociaż 'f' i' f2' zachowują się tak samo, ponieważ podstawowy kod jest taki sam, to często nie stanowi to problemu. –

+2

Może to być, jeśli są zamknięte. Mogą mieć ten sam kod źródłowy, mogą być generowane przez tę samą funkcję zewnętrzną, ale będą związane z różnymi wartościami w zamknięciach. Więc ** zachowują się ** inaczej, ale wyglądają tak samo. – SWilk

1
var f = function(){ 

}; 
var obj = {}; 
obj[f] = "a"; 
console.log(obj['function(){\r\n\r\n}']); 
Powiązane problemy