Tengo esta pregunta en una entrevista

El uso de javascript, escribir una matriz de n elementos. Cada elemento de la matriz es una función que llama a la consola.registro de su propio índice. Por ejemplo, el primer elemento de la consola.registro de 0, el segundo elemento de la consola.registro 1….

Gracias de antemano

Edit: lo Siento por preguntar antes de investigar. Soy nuevo en la programación y aplicaciones; no sé lo que el cierre es & podía encontrar algo en la búsqueda. Tengo la respuesta a mí mismo, pero aquí está el problema que tenía. Escribí algo como esto

n = 10
var array = []
for (var i=0; i < n; i ++) {
array[i] = function() {
        console.log(i);
    }
}

for (var j=0; j < n; j ++) {
    array[j]()
}
InformationsquelleAutor hvu89 | 2013-06-13

2 Comentarios

  1. 2

    No hay una manera fácil de hacer de lo que estás preguntando, porque si pones una función de cada elemento de la matriz, que la función no saben lo que es índice de la matriz fue a menos que obligados de alguna manera a una función personalizada para cada índice de la matriz.

    Pero, todo esto suena un poco como usted no nos dice cuál es el problema real. Si usted está iterando sobre una matriz y llamar a una función en el elemento de la matriz, a continuación, sólo tiene que pasar el índice para que funcione como el primer argumento.

    Podría llamar a cada función en la matriz y que pasa en el índice de su sitio como este:

    function fn1(index) {
        console.log(index);
        //do other things here specific to this function
    }
    //fn2 ... fn4 definitions
    
    var listOfFunctions = [fn1, fn2, fn3, fn4];
    
    for (var i = 0; i < listOfFunctions.length; i++) {
        listOfFunctions[i](i);
    }

    O, nos dicen cuál es el problema real es así, podemos ayudar directamente a resolver eso.

    • La gente se molesta cuando en realidad responde a una pregunta que se consideran demasiado trivial o algún tipo de tarea/pregunta de la entrevista. Yo, por otro lado, no creo que merezca una downvote. Esta es una respuesta válida, independientemente de la moral detrás de la pregunta. Alguien, en algún lugar, puede realmente quiere saber la respuesta para más puro razones.
    • thx Marca. Parece que el downvote ha sido eliminado. La pregunta original deja mucho que desear. Mi personal de quejas es que cuando la gente haga una pregunta sobre alguna solución sin decirnos cuál es el problema real (este es un caso perfecto de que) por lo que no puede ayudar con el problema real. Pero, yo trato de hacer mi mejor esfuerzo para ser útil dada la información proporcionada.
    • (No fue mi downvote) Aún así, a veces estoy apto para downvote (cualquiera) de las respuestas en las preguntas con obvio duplicados donde mejores respuestas ya existen.
    • desde el OP no incluyen su propio código, es sólo una conjetura sobre si esta pregunta es una dup o no. Podría ser o esto podría ser un problema diferente. No la he leído de la manera en que lo hizo, que es la razón por la que me he ofrecido una respuesta diferente.
    • Sí, simplemente pasando el índice es sin duda la forma más sencilla 🙂 resultó la falta de cierre de la era de hecho su problema. Sin embargo, su código actual no está funcionando: ¿se olvidó de los otros 4 declaraciones de función o quiso decir [fn1, fn1, fn1, …, fn1]?
    • No hay ningún punto en el que tienen la misma función en cada punto en una matriz (¿por qué molestarse si ese es el caso). Supuse que el OP había N diferentes funciones en la matriz. He definido fn1 sólo como un ejemplo, el resto de las definiciones de función están a la izquierda para el lector.
    • Gracias por la edición de aclarar que 🙂

  2. 0

    Aquí es una (de varias maneras) para hacerlo.

    var arr = [];
    
    for (var i = 0; i < 10; i++) {
        arr.push(function(){
            console.log(this.indexOf(arguments.callee));
        });
    }
    
    arr[3](); //3
    arr[7](); //7

    this se refieren a la matriz, si se llama a la función en la forma arr[index](). arguments.callee se refiere a la función en sí, dentro de sí mismo. Así que la función de búsquedas de sí en el interior de la matriz que se adjunta y que imprime el índice.

    EDITAR

    Como jfriend00 señaló correnctly, arguments.callee es obsoleto y no es compatible en modo estricto.
    Así que aquí es un «limpiador» de la solución (con la sugerencia de Bergi):

    var arr = [], func;
    
    for (var i = 0; i < 10; i++) {
        arr.push(function printIndex(){
            console.log(this.indexOf(printIndex));
        });
    }
    
    arr[3](); //3
    arr[7](); //7
    • FYI, arguments.callee no es compatible en modo estricto, que es probablemente la forma en que debemos estar escribiendo código, ya sea ahora o en el futuro.
    • Sé que no es compatible. Quería publicar una respuesta sin el uso de cierres (supongo que porque me pareció más bonito si la función no tiene una «codificado» número). Bueno…supongo que poner una nota al final. De todos modos, gracias por señalándolo.
    • Sólo tiene que utilizar un nombre de función: function findme(){ console.log(this.indexOf(findme)); }
    • Yo sólo quería escribir para que esto no iba a funcionar ya que solo se crea una función y referirse a la misma función en todos los elementos de matriz. Así indexOf siempre consulte el índice 0. Pero supongo que si se crea un cierre a su alrededor, no tendría trabajo. Sí, buena idea.
    • No, en realidad no necesitas el cierre – la función de la expresión se evalúa a una función diferente cada vez. O al menos deberían, JScript tiene un grave error con el nombre de las expresiones de función.
    • Una declaración de la función como function printIndex(){...} no funciona para mí. No estoy seguro de si es una norma de comportamiento o no, pero al menos en Chrome la función aparentemente serán izados a la parte superior y sólo se evalúa una vez. Pero tal vez usted decir «el nombre de la función de las expresiones». Me di cuenta de que aquellos (var c = function printIndex() {...}) en realidad (ver respuesta actualizada).
    • Sí, me refería a una función de expresión de curso – en realidad sin ningún tipo de variable func o c pero justo en el push() llamada.
    • Sí, por fin tengo lo que significó en su primer comentario 😉

Dejar respuesta

Please enter your comment!
Please enter your name here