Mi script a continuación utiliza el método reduce () para transformar la matriz [[0, 1],[2, 3],[4, 5]] en [1, 2, 3, 4, 5]

Al depurar este script, noté que en la pestaña de alcance dentro de las herramientas de desarrollo de Chrome (ver captura de pantalla a continuación), esto tiene un valor de indefinido. ¿Podrías explicarme por qué? Esperaba esto: ventana.

P.S: Sé que hay un método flate () pero mi pregunta es sobre este valor.

Gracias de antemano.

const flattened = [
  [0, 1],
  [2, 3],
  [4, 5]
].reduce(
  (acc, item) => {
    debugger;
    return acc.concat(item)
  }, []);

Screenshot

1
zakEls 24 dic. 2019 a las 19:55

2 respuestas

La mejor respuesta

Estás utilizando una función de flecha, que tiene algunas diferencias en comparación con las funciones normales. Las funciones de flecha no tienen un valor esto .

Si reemplaza la función de flecha

(acc, item) => {

Con una función normal

function (acc, item) {

Entonces 'esto' se establecerá en 'Ventana'.

--

Ejemplo de código y más información aquí:

let user = { 
    name: "GFG", 
    gfg1:() => { 
        console.log("hello " + this.name); // no 'this' binding here 
    }, 
    gfg2(){        
        console.log("Welcome to " + this.name); // 'this' binding works here 
    }   
 }; 
user.gfg1(); 
user.gfg2(); 

--

EDITAR: su código realmente funciona, solo la asignación para const no tiene un valor de retorno, por lo que imprime "indefinido" en la consola. Para imprimir el valor en el const, simplemente agréguelo al final:

const flattened = [
  [0, 1],
  [2, 3],
  [4, 5]
].reduce(
  (acc, item) => {
    return acc.concat(item)
  }, []); 
flattened

Salida:

(6) [0, 1, 2, 3, 4, 5]
0
gregn3 24 dic. 2019 a las 18:00

Como está dentro de una función de flecha, utilizará el alcance léxico para decidir el valor de esto.

Cada vez que veo esta palabra clave dentro de una función, estos son los pasos que tomo para averiguar a qué se refiere. Tomado de aquí.

  1. Mire hacia dónde se invocó la función.
  2. ¿Hay un objeto a la izquierda del punto? Si es así, a eso se refiere la palabra clave "this". Si no, continúe con el # 3.
  3. ¿Se invocó la función con "call", "apply" o "bind"? Si es así, indicará explícitamente a qué hace referencia la palabra clave "this". Si no, continúe con el # 4.
  4. ¿Se invocó la función usando la palabra clave "nuevo"? Si es así, la palabra clave "this" hace referencia al objeto recién creado que realizó el intérprete de JavaScript. Si no, continúe con el # 5.
  5. ¿Está "esto" dentro de una función de flecha? Si es así, su referencia se puede encontrar léxicamente en el alcance adjunto (principal). Si no, continúe con el # 6.
  6. ¿Estás en "modo estricto"? En caso afirmativo, la palabra clave "this" no está definida. Si no, continúe con el # 7.
  7. JavaScript es raro. "esto" hace referencia al objeto "ventana".
0
Jyoti Prasad Pal 24 dic. 2019 a las 18:27