New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Existe alguma razão para usar "var" a partir do ES6? #803

Open
LFeh opened this Issue Nov 8, 2017 · 9 comments

Comments

Projects
None yet
9 participants
@LFeh
Contributor

LFeh commented Nov 8, 2017

Estávamos tendo essa discussão no Cubo ontem (@mikailcf, @Xhamps) e levei para o Twitter, a discussão por lá cresceu mais do que imaginava e tiveram respostas incríveis.

Alguns comentários:

Tem aquele "pequeno" problema que ainda não foi resolvido em relação ao typeof. Quando usamos var, a runtime não só armazena variável na memória, mas também faz o "evaluate" dela. No let ou const não temos isso.
Muito embora isso não seja justificativa para voltarmos a usar o danado do var, que mais trouxe problemas pra gente desde sempre do que soluções. Hoje, não tem porque se usar var mais. Não faz nenhum sentido. Principalmente em browsers mais recentes.
Se perguntarmos pelo typeof de uma variável ainda não definida por let, ganhamos um ReferenceError na cara. Antes, com o var, a variável era inicializada com "undefined". Logo, typeof já não é mais tão seguro em let/const.
@oirodolfo

Na minha opinião até o "let" deve ser evitado. O "var" então é muito difícil de justificar. @matheusml

E forçamos o const através do lint tb. Let só se precisar realmente.
basicamente const é referência de memória constante, imutável. No caso de tipos "primitivos", como number, funciona como const de OO mesmo
@loiane

Nunca mais usei var desde q comecei a usar ES6+, e configuro o lint para me obrigar a usar const se não for mudar a referência da variável
E comecei a usar ES6 desde q lançou com babel, ou seja, já faz uns 2 anos q não uso var. Realmente não vejo motivo algum para usar.
@willgm

Basicamente você só irá usar var se por algum (estranho/legado) motivo você quiser manter function scope em vez de block scope. Fora isso, não há nenhuma razão para usar o var.
@bruno-vinicius


Então, agora estou trazendo pra cá: Existe alguma razão para usar "var" a partir do ES6?

@edmolima

This comment has been minimized.

Show comment
Hide comment
@edmolima

edmolima Nov 8, 2017

Tentando ajudar na discussão @LFeh, acredito que temos que lembrar nessa situação da semântica também.

let: variável local no escopo do bloco atual
const: variável cujo o valor é fixo
var: declara uma variável, opcionalmente é possível atribuir algo a ela.

Todas essas definições tirei do MDN.

A partir disso falando sobre mim, faz tempo que não uso var e utilizo pouco let, mas muito pela necessidade atual. Trabalho quase que 100% do tempo em projeto com programação funcional então não preciso fazer a reatribuição.

Mas não vejo nenhum problema em utilizar um ou outro apesar de considerar o que a Loiane falou importante. Eu realmente consideraria a semântica ao decidir quando usar um ou outro, afinal poderíamos também questionar se faz sentido usarmos const em tudo e por que?!

Ah e achei esse artigo que talvez possa nos ajudar a discutir sobre o assunto: Quando usar let, var e const no javascript

edmolima commented Nov 8, 2017

Tentando ajudar na discussão @LFeh, acredito que temos que lembrar nessa situação da semântica também.

let: variável local no escopo do bloco atual
const: variável cujo o valor é fixo
var: declara uma variável, opcionalmente é possível atribuir algo a ela.

Todas essas definições tirei do MDN.

A partir disso falando sobre mim, faz tempo que não uso var e utilizo pouco let, mas muito pela necessidade atual. Trabalho quase que 100% do tempo em projeto com programação funcional então não preciso fazer a reatribuição.

Mas não vejo nenhum problema em utilizar um ou outro apesar de considerar o que a Loiane falou importante. Eu realmente consideraria a semântica ao decidir quando usar um ou outro, afinal poderíamos também questionar se faz sentido usarmos const em tudo e por que?!

Ah e achei esse artigo que talvez possa nos ajudar a discutir sobre o assunto: Quando usar let, var e const no javascript

@bruno-vinicius

This comment has been minimized.

Show comment
Hide comment
@bruno-vinicius

bruno-vinicius Nov 8, 2017

Sobre o que @edmolima disse sobre o uso generalizado de const, o Jame Kayle (@getify) no seu livro You Don't know JS, da uma explicação bastante razoavel sobre:

image

Link: https://github.com/getify/You-Dont-Know-JS/blob/master/es6%20%26%20beyond/ch2.md

bruno-vinicius commented Nov 8, 2017

Sobre o que @edmolima disse sobre o uso generalizado de const, o Jame Kayle (@getify) no seu livro You Don't know JS, da uma explicação bastante razoavel sobre:

image

Link: https://github.com/getify/You-Dont-Know-JS/blob/master/es6%20%26%20beyond/ch2.md

@getify

This comment has been minimized.

Show comment
Hide comment
@getify

getify Nov 8, 2017

Eu só falo inglês, então meu comentário aqui é traduzido; Perdoe-me se é confuso.

Minha sugestão seria considerar outras perspectivas em var,let e const. Eu descrevi essas perspectivas nestas duas postagens de blog:

Resumo: contrariamente ao conselho mais popular da ES6, recomendo que os desenvolvedores realmente abordem dessa maneira:

  1. Padrão para var
  2. Use apenas let quando você realmente está fazendo um escopo de bloco (não apenas um escopo de nível superior em uma função)
  3. Use apenas const se você estiver atribuindo um valor imutável (como um primitivo). Nunca use const com valores mutáveis como objetos, arrays, funções.

getify commented Nov 8, 2017

Eu só falo inglês, então meu comentário aqui é traduzido; Perdoe-me se é confuso.

Minha sugestão seria considerar outras perspectivas em var,let e const. Eu descrevi essas perspectivas nestas duas postagens de blog:

Resumo: contrariamente ao conselho mais popular da ES6, recomendo que os desenvolvedores realmente abordem dessa maneira:

  1. Padrão para var
  2. Use apenas let quando você realmente está fazendo um escopo de bloco (não apenas um escopo de nível superior em uma função)
  3. Use apenas const se você estiver atribuindo um valor imutável (como um primitivo). Nunca use const com valores mutáveis como objetos, arrays, funções.
@bruno-vinicius

This comment has been minimized.

Show comment
Hide comment
@bruno-vinicius

bruno-vinicius Nov 8, 2017

Thanks for your contribution @getify , your books and provided links helped us about this topic. Also your translated portuguese are very good =D.

bruno-vinicius commented Nov 8, 2017

Thanks for your contribution @getify , your books and provided links helped us about this topic. Also your translated portuguese are very good =D.

@suissa

This comment has been minimized.

Show comment
Hide comment
@suissa

suissa Nov 8, 2017

Serve para quem quer fazer hoisting, mas eu acho um má prática.

suissa commented Nov 8, 2017

Serve para quem quer fazer hoisting, mas eu acho um má prática.

@klarkc

This comment has been minimized.

Show comment
Hide comment
@klarkc

klarkc Nov 9, 2017

Sinceramente não vejo mais necessidade, um código bem estruturado não vai precisar usar var no lugar de let ou const. var tem cara de gambiarra rs

klarkc commented Nov 9, 2017

Sinceramente não vejo mais necessidade, um código bem estruturado não vai precisar usar var no lugar de let ou const. var tem cara de gambiarra rs

@gtkatakura

This comment has been minimized.

Show comment
Hide comment
@gtkatakura

gtkatakura Nov 10, 2017

Realmente as duas diferenças do var são o hoisting e o typeof (justamente por causa do hoisting). Eu não uso e configuro o ESLint para soltar um erro onde tem var. Tenho outro assunto agora para debater, sobre declaração de funcões.

Assim:

function map() {
}

Ou assim:

const map = () => {};

Eu geralmente não uso mais function declaration, uso somente function expression. Tem somente um caso que eu uso o function declaration, quando eu preciso possuir o this dinâmico em vez do this léxico (poucos cenários).

gtkatakura commented Nov 10, 2017

Realmente as duas diferenças do var são o hoisting e o typeof (justamente por causa do hoisting). Eu não uso e configuro o ESLint para soltar um erro onde tem var. Tenho outro assunto agora para debater, sobre declaração de funcões.

Assim:

function map() {
}

Ou assim:

const map = () => {};

Eu geralmente não uso mais function declaration, uso somente function expression. Tem somente um caso que eu uso o function declaration, quando eu preciso possuir o this dinâmico em vez do this léxico (poucos cenários).

@woliveiras

This comment has been minimized.

Show comment
Hide comment
@woliveiras

woliveiras Nov 10, 2017

Contributor

Sua pergunta sobre a função cabe em um tópico separado, ein @gtkatakura

Seria uma boa discussão! 😬 😬

Contributor

woliveiras commented Nov 10, 2017

Sua pergunta sobre a função cabe em um tópico separado, ein @gtkatakura

Seria uma boa discussão! 😬 😬

@munizart

This comment has been minimized.

Show comment
Hide comment
@munizart

munizart Nov 13, 2017

@gtkatakura concordo com boa parte dos arumentos apresentados aqui https://github.com/getify/Functional-Light-JS/blob/master/ch2.md#whats-in-a-name sobre as arrow functions, porem apesar de ali dizer expressamente para evitar, eu gosto de usa-las pra callbacks de um argumento só ou funções que retornam outras funções, por exemplo:

const getProp = obj => prop => obj && obj[prop]

munizart commented Nov 13, 2017

@gtkatakura concordo com boa parte dos arumentos apresentados aqui https://github.com/getify/Functional-Light-JS/blob/master/ch2.md#whats-in-a-name sobre as arrow functions, porem apesar de ali dizer expressamente para evitar, eu gosto de usa-las pra callbacks de um argumento só ou funções que retornam outras funções, por exemplo:

const getProp = obj => prop => obj && obj[prop]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment