Estou interessado em saber se existem limites para quais tipos de valores podem ser definidos usando const
JavaScript - em funções específicas. Isso é válido? Concedido que funciona, mas é considerado má prática por qualquer motivo?
const doSomething = () => {
...
}
Todas as funções devem ser definidas dessa maneira no ES6? Não parece que isso pegou, se sim.
Obrigado por qualquer comentário!
javascript
function
const
ecmascript-6
David Sinclair
fonte
fonte
var doSomething = <function def>;
. 4) "Todas as funções devem ser definidas dessa maneira no ES6?" Parece complicado para mim. Eu gosto de declarações de função. Todo mundo é seu.const
. Deseja impedir-se de substituir a função? Eu suponho que você conhece seu código para não fazer isso de qualquer maneira. Deseja expressar a intenção dedoSomething
, ou seja, que ela detenha uma função e não altere seu valor? Eu acho que as declarações de função também comunicam essa intenção claramente. Portanto, se você precisar de "proteção de tempo de execução", substitua-a. Caso contrário, não vejo muitos benefícios. Claro que se você costumava usarvar foo = function() {};
, eu usaria emconst
vez devar
.const
algum.Respostas:
Não há problema com o que você fez, mas você deve se lembrar da diferença entre declarações e expressões de função.
Uma declaração de função, ou seja:
É içada inteiramente para o topo do escopo (e assim por diante,
let
econst
eles também têm escopo de bloco).Isso significa que o seguinte funcionará:
Uma expressão de função, ou seja:
É a criação de uma função anônima (
function () {}
) e a criação de uma variável e, em seguida, a atribuição dessa função anônima a essa variável.Portanto, as regras usuais sobre a elevação de variáveis dentro de um escopo - variáveis com escopo de bloco (
let
econst
) não elevam quantoundefined
ao topo do escopo de seu bloco.Isso significa:
Falhará, pois
doSomething
não está definido. (Ele jogará aReferenceError
)Se você mudar para o uso,
var
obterá a elevação da variável, mas ela será inicializada paraundefined
que o bloco de código acima ainda não funcione. (Isso ativará umaTypeError
vez quedoSomething
não é uma função no momento em que você a chama)No que diz respeito às práticas padrão, você deve sempre usar a ferramenta adequada para o trabalho.
Axel Rauschmayer tem um ótimo post sobre escopo e içamento, incluindo a semântica es6: Variáveis e escopo no ES6
fonte
function a(){console.log(this);}
e bconst a=_=>{console.log(this);}
é se você chamá-lo assima.call(someVar);
, em um , ele irá imprimirsomeVar
, em b , ele irá imprimirwindow
.Embora usar
const
para definir funções pareça um hack, mas vem com algumas grandes vantagens que o tornam superior (na minha opinião)Isso torna a função imutável, para que você não precise se preocupar com a alteração dessa função por outro código.
Você pode usar a sintaxe da seta gorda, que é mais curta e limpa.
O uso das funções de seta cuida da
this
ligação para você.exemplo com
function
mesmo exemplo com
const
fonte
function f(x, y) {
tem 18 caracteres,const f = (x, y) => {
21 caracteres e, portanto, mais 3 caracteres. 3. Manter essa ligação apenas importa se as funções forem definidas dentro de um método (ou outra função que tenha significado significativo). No script de nível superior, é inútil. Não estou dizendo que você está errado, apenas que os motivos mencionados não são terrivelmente relevantes.Já se passaram três anos desde que essa pergunta foi feita, mas agora estou me deparando com ela. Como esta resposta está tão abaixo da pilha, permita-me repeti-la:
Fiquei motivado a fazer alguma pesquisa depois de observar um prolífico codificador JavaScript que sempre usa
const
declaraçõesfunctions
, mesmo quando não há motivo / benefício aparente.Em resposta a " isso é considerado uma má prática por algum motivo? ", Digamos, IMO, sim, é ou pelo menos há vantagens em usar a
function
declaração.Parece-me que isso é em grande parte uma questão de preferência e estilo. Existem alguns bons argumentos apresentados acima, mas nenhum tão claro como é feito neste artigo:
Confusão constante: por que ainda uso declarações de função JavaScript em medium.freecodecamp.org/Bill Sourour, guru de JavaScript, consultor e professor.
Peço a todos que leiam esse artigo, mesmo que você já tenha tomado uma decisão.
Aqui estão os principais pontos:
fonte
defaultErrorHandler
const atribuída como uma função anônima que eu possa chamar de manipuladores de promessa. Isso me permitiria 'substituir' opcionalmente esse manipulador de erros padrão nas funções necessárias. Alguns só precisam retornar um objeto de erro e outros precisam retornar uma resposta http, variando os níveis de verbosidade. No entanto, a estrutura do código pode ser um padrão familiar, independentemente..then( res.success, res.error )
muito mais do que as funções anônimas que declarei apenas chamarres.success(value);
. Ter um.then( ..., defaultErrorHandler)
padrão comum pode ser bom, com uma função defaultErrorHandler definida de nível superior e, opcionalmente, ter umconst defaultErrorHandler = error => { ... }
declarado dentro de um escopo de função, conforme desejado.Existem alguns benefícios muito importantes para o uso
const
e alguns diriam que ele deve ser usado sempre que possível, devido à sua deliberação e indicação.É, até onde posso dizer, a declaração mais indicativa e previsível de variáveis em JavaScript, e uma das mais úteis, PORQUE o quão restrito é. Por quê? Porque elimina algumas possibilidades disponíveis
var
elet
declarações.O que você pode deduzir quando lê um
const
? Você sabe tudo o que se segue apenas lendo aconst
declaração e AND sem procurar outras referências a essa variável:A citação a seguir é de um artigo que discute os benefícios de
let
econst
. Também responde mais diretamente à sua pergunta sobre as restrições / limites da palavra-chave:Fonte: https://ponyfoo.com/articles/var-let-const
fonte