Soy muy nuevo en JavaScript, por lo que me desconcierta la siguiente sintaxis:

if (isFunction(obj)){
  for (key in obj) {
    //do something
  }
 }

El método isFunction devolverá verdadero si typeOf obj=="function". Pero, ¿qué sucede cuando dices key in obj cuando obj es una función?

3
Codier 26 may. 2011 a las 07:42

4 respuestas

La mejor respuesta

El bucle for..in itera sobre las propiedades enumerables de obj. Las funciones son objetos, tienen sus propias propiedades más propiedades heredadas de su cadena [[prototipo]]. Ver ECMA-262 §12.6.4.

Además, no olvide declarar variables que deben mantenerse locales.

Para abordar solo las propiedades enumerables en obj y no sus propiedades enumerables heredadas, es habitual incluir una prueba hasOwnProperty :

for (var key in obj) {
  if (obj.hasOwnProperty(key)) {
    // key is enumerable property of obj, not inherited
  }
}
4
RobG 26 may. 2011 a las 03:47

Aquí hay un jsfiddle (no estoy seguro si esto ayuda) http://jsfiddle.net/FEAzV/

1
David 26 may. 2011 a las 03:55

Las funciones de JavaScript también son objetos, lo que significa que pueden tener propiedades. Puedes hacer algo como esto:

var f = function () {};
f.a = "foo";
f.b = "bar";

Si obj era f, entonces el bucle for iteraría con key siendo "a" y "b".

Básicamente, el bucle for in itera sobre todas las propiedades de un objeto, excepto aquellas marcadas internamente como no enumerables (principalmente métodos y propiedades incorporados).

4
Tikhon Jelvis 26 may. 2011 a las 03:46

Las funciones también pueden tener propiedades, el siguiente código es válido:

var foo = function() { }
foo.prop1 = 1;
foo.prop2 = "hello";

El bucle for (key in obj) enumeraría prop1 y prop2.

1
carlosfigueira 26 may. 2011 a las 03:46