ECMAScript 5.1 - Sección 11.2.1:
La producción MemberExpression : MemberExpression [ Expression ]
se evalúa de la siguiente manera:
- Vamos baseReference ser el resultado de evaluar MemberExpression.
- Deje que baseValue sea GetValue (referencia base).
- Deje que propertyNameReference sea el resultado de evaluar Expression.
- Deje que propertyNameValue sea GetValue (propertyNameReference).
- Llamada CheckObjectCoercible (baseValue).
- Deje que propertyNameString sea ToString (propertyNameValue).
- Si la producción sintáctica que se está evaluando está contenida en el código de modo estricto, deje que strict sea cierto, de lo contrario, deje strict sea falso.
- Devuelve un valor de tipo Referencia cuyo valor base es Valor base y cuyo nombre de referencia es propertyNameString y cuyo indicador de modo estricto es estricto.
Así que cuando se utiliza obj[whatever]
, whatever
se convierte en una cadena. Para una función, esta será una cadena que contiene el código fuente de la función.
Ejemplo:
js> var func = function() { return 'hi'; };
js> function helloworld() { return 'hello world'; }
js> var obj = {};
js> obj[func] = 123;
js> obj[helloworld] = 456;
js> obj
({'function() {\n return "hi";\n}':123,
'function helloworld() {\n return "hello world";\n}':456
})
Bueno, trabajó en Chrome. Entonces podría funcionar en Safari y Firefox –
, creo que es como si alertaras una función, de alguna manera el motor la analiza como una cadena porque es permisiva ... Pero diría que no es una buena idea, a menos que lances como cadena usted mismo antes (es posible que me pregunte) – Sebas
Las claves de cualquier tipo de cualquier objeto de clase del diccionario deben tener una operación bien definida ==. Tal operación no se puede definir para las funciones (http://en.wikipedia.org/wiki/Rice%27s_theorem). –