2017-08-29 2 views
-1

J'ai une fonction currentPlayer comme suit:localement variable scope n'est pas définie en fonction

function currentPlayer(players) { 
    return players.findIndex(player => player.current) || 0; 
} 

Je suis en train d'utiliser cette fonction dans un réducteur comme suit:

export function players(players = [], action) { 
    players = players.slice(); 
    switch (action.type) { 
    ... 
    case DELETE_PLAYER: 
     const currentPlayer = currentPlayer(players); 
     if (currentPlayer === action.index) { 
     players = switchNextPlayer(players, currentPlayer); 
     } 
     players.splice(action.index, 1); 

    } 
    return players; 
} 

En exécution de ce code , je reçois l'erreur suivante:

ReferenceError: currentPlayer is not defined

le code fonctionne si je change le nom de la variable comme suit:

const currentPlayerIndex = currentPlayer(players); 

Je pensais que la currentPlayer variable serait SCOPED dans la fonction réducteur. Qu'est-ce qui se passe ici?

+1

'const currentPlayer = currentPlayer (players);' noter 3 noms dans la ligne – Ryan

+0

La fonction est en train d'être éclipsée par la nouvelle liaison 'currentPlayer' qui n'a pas été initialisée au moment où vous l'évaluez, donc vous vous retrouvez avec un erreur de référence – MinusFour

Répondre

1

La déclaration const est interprétée avant l'expression d'initialisation. Ainsi, votre portée locale obtient d'abord son propre symbole currentPlayer, puis l'expression d'initialisation est évaluée. Dans l'expression d'initialisation, par conséquent, currentPlayer fait référence à ce symbole local nouvellement déclaré, pas à la fonction.

+1

par exemple si c'était 'let' au lieu de' const' l'expression ci-dessus serait divisée en: 'let currentPlayer; currentPlayer = joueur actuel (joueurs); ' – topher