SlideShare a Scribd company logo
Treviso JS Meetup:
Cattive abitudini e
Linee guida
Anti-patterns
(ovvero situazioni da evitare)
Dichiarare variabili senza il "var"
Dichiarando variabili senza il var, automaticamente
andiamo a definirle come Globali.
Da evitare!
name="Paperino";
function stampaPaperino() {
name ="Paperino";
console.log(name);
}
Utilizzando il "var", lo scope (ambiente dove vive la
variabile) diventa quello della funzione in cui è definita.
Corretto!
var name="Paperino";
function stampaPaperino() {
var name ="Paperino";
console.log(name);
}
var a = b = 0;
In questo caso l'interprete riscrive il codice in questo modo:
quindi "b" è globale.
Da evitare!
b = 0;
var a = b;
Questo pattern prevede di dichiarare tutte le variabili
utilizzando un solo "var".
Corretto!
var a = 0,
b = 0;
Sparpagliare variabili all'interno di
una funzione
"pluto" e "paperino" sono dichiarate in due momenti
separati all'interno della funzione.
Da evitare!
function plutoAiutaPaperino() {
var pluto = new Pluto();
pluto.corre();
pluto.mangia();
...
var paperino = new Paperino();
pluto.aiuta(paperino);
}
Più leggibile e evitiamo problemi legati all' "hoisting".
Corretto!
function plutoAiutaPaperino() {
var pluto = new Pluto(),
paperino = new Paperino();
pluto.corre();
pluto.mangia();
pluto.aiuta(paperino);
}
For loops scritti male
"i" in questo caso è globale. Se "list" è un array
particolarmente grande il dover recuperare ad ogni
iterazione il valore di "list.length" rallenta il codice.
Da evitare!
for(i = 0; i < list.length; i++) {
// do something
};
"list.length" in questo caso viene "cachato" nella variabile
"len". ( )
Corretto!
for(var i = 0, len = list.length; i < len; i++) {
// do something
};
http://jsperf.com/loops
Eval is evil
"eval" esegue il codice javascript inserito in una stringa.
Da evitare!
eval('var i = "Welcome Hackers!"; alert(i);');
Usare i costruttori predefiniti al
posto della sintassi "literal".
Qualsiasi cosa in Javascript è un Object, il linguaggio mette
a disposizione dei costruttori che ereditano da Object
implementando nuove funzionalità. "new Array()" ad
esempio crea un oggetto di tipo Array con delle funzionalità
come "pop","push","shift", etc.
Da evitare!
var disney = new Array("Pippo","Topolino","Paperino");
Corretto!
var disney = ["Pippo","Topolino","Paperino"];
Questa sintassi è molto più pulita e condivisa da gran parte
dei linguaggi di programmazione.
Inquinamento Globale
E' buona norma evitare di definire variabili o funzioni nello
"scope globale" perchè sono accessibili e modificabili in
qualsiasi punto dell'applicazione.
C'è il rischio che vengano accidentalmente sovrascritte da
altri programmatori o plugin esterni e rendono il codice
difficile da mantenere.
Da evitare!
<script>
var pluto = new Pluto(),
plutoHouse = new DogHouse({color:red,material:'wood', size: [100,100
function loadPlutoHouse() {
return pluto.load(house);
}
</script>
Tutte le variabili definite nel frammento di codice sopra-
riportato sono globali perchè non sono definite all'interno di
una funzione.
Usare una funzione che viene definita e subito invocata crea
uno "scope isolato". Variabili e funzioni esistono solo
all'interno dell' IIFE.
Corretto!
<script>
// IIFE = Immediately-Invoked Function Expression
(function(document, window, undefined){
var pluto = new Pluto(),
plutoHouse = new DogHouse({color:red,material:'wood', size: [100
function loadPlutoHouse() {
return pluto.load(house);
}
})(document,window);
</script>
Esempio in jQuery
<script>
// IIFE = Immediately-Invoked Function Expression
(function($,document, window){
//code immediately executed goes here
$(function(){
//code executed on document ready goes here
});
})(jQuery, document,window, undefined);
</script>
jQuery
Anti-patterns
Evviva i costruttori!
Ogni volta che usiamo $('...') viene creato un nuovo oggetto
jQuery parsando il DOM e cercando l'elemento
corrispondente. Assolutamente poco performante.
Da evitare!
$('button.confirm').on('click', function() {
// Do it once
$('.modal').modal();
// And once more
$('.modal').addClass('active');
// And again for good measure
$('modal').css(...);
});
jQuery ci permette di "concatenare" più funzioni al
medesimo oggetto $ perchè ogni funzione ritorna l'instanza
dell'elemento DOM jquerizzato.
Soluzione 1: Chaining
$('button.confirm').on('click', function() {
$('.modal')
.modal()
.addClass('active')
.css(...);
});
Salvare il riferimento all'oggetto jQuery per poi riusarlo nel
codice è la soluzione ottimale. In particolare all'interno dei
listener evitiamo di dover "attraversare" il DOM ogni volta
che si scatena l'evento a cui l'ascoltatore è associato.
Soluzione 2: Caching
var $buttonConfirm = $('button.confirm'),
$modal = $('.modal');
$background = $('.bg-overlay');
$buttonConfirm.on('click', function() {
$modal
.modal()
.addClass('active')
.css(...);
$background.removeClass('hidden');
});
L'inferno delle CallBack
Annidare callback porta a codice difficile da capire e
mantenere.
Da evitare!
$buttonConfirm.on('click', function() {
$overlay.fadeIn(400, function(){
$.ajax('/some/modal/content',{},function(data){
$overlay.html(data).slideUp(300, function() {
....
})
})
})
});
Portare le funzioni all'esterno aiuta la leggibilità.
Un pò meglio
$buttonConfirm.on('click', showOverlay);
function showOverlay() {
$overlay.fadeIn(400, getOverlayDataFromServer);
}
function getOverlayDataFromServer() {
$.ajax('/some/modal/content',{}, updateOverlayContent);
}
function updateOverlayContent(data) {
$overlay.html(data).slideUp(300, function() {
....
})
}
Alcuni medoti jQuery ritornano direttamente un Deferred
object, è possibile creare anche "azioni" custom che
utilizzano $.Deferred.
Deferred Objects
$buttonConfirm.on('click', function(e){
$.when(showOverlay())
.then(getOverlayDataFromServer())
.done(updateOverlayContent(data))
.fail(function(){ alert("Something went wrong!") });
});
function showOverlay() {
// $.fn.fadeIn has a promise() method defined so it works like a deferred
return $overlay.fadeIn(400);
}
function getOverlayDataFromServer() {
return $.ajax('/some/modal/content');
}
function updateOverlayContent(data) {
Linee guida
(Tools per scrivere Javascript pulito)
'use strict';
Con questa dicitura abilitiamo la modalità "Strict Mode":
per alcuni sbagli (o cattive abitudini) normalmente accettati
dall'interprete JS vengono sollevati errori.
'use strict';
function myFunction() {
'use strict';
//...
}
Usare un linter JS: JsHint
Può essere usato sia come plugin nell'editor di testo sia
all'interno del vostro task manager (Grunt/Gulp).
Esempio
Scegliere una StyleGuide e usare
JSCS
Ogni programmatore ha le sue abitudini, giuste o sbagliate
che siano.
Scegliere una styleguide e condividerla con il team di
progetto è fontamentale per avere un codice omogeneo e
"stilisticamente" pulito.
AirBnB
Google
jQuery
Idiomatic.js
JSCS

More Related Content

What's hot

Javascript - 2 | WebMaster & WebDesigner
Javascript - 2 | WebMaster & WebDesignerJavascript - 2 | WebMaster & WebDesigner
Javascript - 2 | WebMaster & WebDesignerMatteo Magni
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewFrancesco Sciuti
 
Acadevmy - ES6 Modern JS Today
Acadevmy - ES6 Modern JS TodayAcadevmy - ES6 Modern JS Today
Acadevmy - ES6 Modern JS TodayFrancesco Sciuti
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object OrientedManuel Scapolan
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScriptGiovanni Buffa
 
Php mysql e cms
Php mysql e cmsPhp mysql e cms
Php mysql e cmsorestJump
 
Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerMatteo Magni
 
Pycrashcourse
PycrashcoursePycrashcourse
Pycrashcourserik0
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Marcello Missiroli
 
Comunicazione tra procesi Linux
Comunicazione tra procesi LinuxComunicazione tra procesi Linux
Comunicazione tra procesi LinuxMarco Buttolo
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsJUG Genova
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 

What's hot (20)

Javascript - 2 | WebMaster & WebDesigner
Javascript - 2 | WebMaster & WebDesignerJavascript - 2 | WebMaster & WebDesigner
Javascript - 2 | WebMaster & WebDesigner
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript Overview
 
PHP
PHPPHP
PHP
 
Acadevmy - ES6 Modern JS Today
Acadevmy - ES6 Modern JS TodayAcadevmy - ES6 Modern JS Today
Acadevmy - ES6 Modern JS Today
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object Oriented
 
Corso c++
Corso c++Corso c++
Corso c++
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScript
 
Php mysql e cms
Php mysql e cmsPhp mysql e cms
Php mysql e cms
 
Pillole di C++
Pillole di C++Pillole di C++
Pillole di C++
 
Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesigner
 
Comandi bash
Comandi bashComandi bash
Comandi bash
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 
Pycrashcourse
PycrashcoursePycrashcourse
Pycrashcourse
 
Il simulatore NS-2
Il simulatore NS-2Il simulatore NS-2
Il simulatore NS-2
 
Espressioni regolari
Espressioni regolariEspressioni regolari
Espressioni regolari
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
Comunicazione tra procesi Linux
Comunicazione tra procesi LinuxComunicazione tra procesi Linux
Comunicazione tra procesi Linux
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
2008 python
2008 python2008 python
2008 python
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 

Viewers also liked

Effective Twitter Practices for Businesses - Dane Jackson - Social Media Cons...
Effective Twitter Practices for Businesses - Dane Jackson - Social Media Cons...Effective Twitter Practices for Businesses - Dane Jackson - Social Media Cons...
Effective Twitter Practices for Businesses - Dane Jackson - Social Media Cons...Dane Jackson
 
The church at jerusalem
The church at jerusalemThe church at jerusalem
The church at jerusalemDanny Thomas
 
Scheda di iscrizione festival 2012
Scheda di iscrizione festival 2012Scheda di iscrizione festival 2012
Scheda di iscrizione festival 2012promaenza
 
1c. model model ikatan kimia_basrib.Kimia
1c. model model ikatan kimia_basrib.Kimia1c. model model ikatan kimia_basrib.Kimia
1c. model model ikatan kimia_basrib.Kimiabaskimia
 
Emerging business opportunities for sustainable development
Emerging business opportunities for sustainable developmentEmerging business opportunities for sustainable development
Emerging business opportunities for sustainable developmentSambit Biswal
 
Ateglance flc
Ateglance flcAteglance flc
Ateglance flcbeefheart
 
Flaming Soccer
Flaming SoccerFlaming Soccer
Flaming SoccerMihex
 
Lamborghini Egoista
Lamborghini EgoistaLamborghini Egoista
Lamborghini EgoistaMihex
 
Amazon's Storage Facility
Amazon's Storage FacilityAmazon's Storage Facility
Amazon's Storage FacilityMihex
 
презентация турусинова
презентация турусиновапрезентация турусинова
презентация турусиноваberjoza
 
Designed Kitchenware
Designed KitchenwareDesigned Kitchenware
Designed KitchenwareMihex
 
Install guide linux
Install guide linuxInstall guide linux
Install guide linuxDim Kin
 
Introduction to plumbing Part 3
Introduction to plumbing Part 3 Introduction to plumbing Part 3
Introduction to plumbing Part 3 vigyanashram
 
Science World Ads
Science World AdsScience World Ads
Science World AdsMihex
 
"Благодійність у спорті: НА СТАРТ! УВАГА! РУШ
"Благодійність у спорті: НА СТАРТ! УВАГА! РУШ"Благодійність у спорті: НА СТАРТ! УВАГА! РУШ
"Благодійність у спорті: НА СТАРТ! УВАГА! РУШufb
 

Viewers also liked (20)

Effective Twitter Practices for Businesses - Dane Jackson - Social Media Cons...
Effective Twitter Practices for Businesses - Dane Jackson - Social Media Cons...Effective Twitter Practices for Businesses - Dane Jackson - Social Media Cons...
Effective Twitter Practices for Businesses - Dane Jackson - Social Media Cons...
 
The church at jerusalem
The church at jerusalemThe church at jerusalem
The church at jerusalem
 
Scheda di iscrizione festival 2012
Scheda di iscrizione festival 2012Scheda di iscrizione festival 2012
Scheda di iscrizione festival 2012
 
1c. model model ikatan kimia_basrib.Kimia
1c. model model ikatan kimia_basrib.Kimia1c. model model ikatan kimia_basrib.Kimia
1c. model model ikatan kimia_basrib.Kimia
 
Emerging business opportunities for sustainable development
Emerging business opportunities for sustainable developmentEmerging business opportunities for sustainable development
Emerging business opportunities for sustainable development
 
Ateglance flc
Ateglance flcAteglance flc
Ateglance flc
 
eeWorkbooksesion10
eeWorkbooksesion10eeWorkbooksesion10
eeWorkbooksesion10
 
Flaming Soccer
Flaming SoccerFlaming Soccer
Flaming Soccer
 
Lamborghini Egoista
Lamborghini EgoistaLamborghini Egoista
Lamborghini Egoista
 
Amazon's Storage Facility
Amazon's Storage FacilityAmazon's Storage Facility
Amazon's Storage Facility
 
презентация турусинова
презентация турусиновапрезентация турусинова
презентация турусинова
 
My CV
My CVMy CV
My CV
 
Designed Kitchenware
Designed KitchenwareDesigned Kitchenware
Designed Kitchenware
 
Install guide linux
Install guide linuxInstall guide linux
Install guide linux
 
Introduction to plumbing Part 3
Introduction to plumbing Part 3 Introduction to plumbing Part 3
Introduction to plumbing Part 3
 
Science World Ads
Science World AdsScience World Ads
Science World Ads
 
PHO_HK2_2011
PHO_HK2_2011PHO_HK2_2011
PHO_HK2_2011
 
"Благодійність у спорті: НА СТАРТ! УВАГА! РУШ
"Благодійність у спорті: НА СТАРТ! УВАГА! РУШ"Благодійність у спорті: НА СТАРТ! УВАГА! РУШ
"Благодійність у спорті: НА СТАРТ! УВАГА! РУШ
 
Concept
ConceptConcept
Concept
 
Ppd ssf open access mar13
Ppd ssf open access mar13Ppd ssf open access mar13
Ppd ssf open access mar13
 

Similar to Cattive abitudini e-lineeguida

Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerMatteo Magni
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 
Let's give it a GO!
Let's give it a GO!Let's give it a GO!
Let's give it a GO!MarioTraetta
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritornolordarthas
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java BaseK-Tech Formazione
 
corso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascriptcorso web developer - Introduzione a Javascript
corso web developer - Introduzione a JavascriptRiccardo Piccioni
 
Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)Marcello Missiroli
 
Scala Programming Linux Day 2009
Scala Programming Linux Day 2009Scala Programming Linux Day 2009
Scala Programming Linux Day 2009Massimiliano Dessì
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)Tarin Gamberini
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webRoberto Messora
 
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryAlberto Buschettu
 
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerMatteo Magni
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of KotlinErik Minarini
 
Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete...
Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete...Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete...
Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete...maik_o
 

Similar to Cattive abitudini e-lineeguida (20)

Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesigner
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Java codestyle & tipstricks
Java codestyle & tipstricksJava codestyle & tipstricks
Java codestyle & tipstricks
 
Let's give it a GO!
Let's give it a GO!Let's give it a GO!
Let's give it a GO!
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
 
7 Sottoprogrammi
7   Sottoprogrammi7   Sottoprogrammi
7 Sottoprogrammi
 
corso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascriptcorso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascript
 
Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)Programmazione a oggetti tramite la macchina del caffé (pt. 2)
Programmazione a oggetti tramite la macchina del caffé (pt. 2)
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
Scala Programming Linux Day 2009
Scala Programming Linux Day 2009Scala Programming Linux Day 2009
Scala Programming Linux Day 2009
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
Javascript
JavascriptJavascript
Javascript
 
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il web
 
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in Jquery
 
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesigner
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of Kotlin
 
Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete...
Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete...Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete...
Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete...
 

Cattive abitudini e-lineeguida

  • 4. Dichiarando variabili senza il var, automaticamente andiamo a definirle come Globali. Da evitare! name="Paperino"; function stampaPaperino() { name ="Paperino"; console.log(name); }
  • 5. Utilizzando il "var", lo scope (ambiente dove vive la variabile) diventa quello della funzione in cui è definita. Corretto! var name="Paperino"; function stampaPaperino() { var name ="Paperino"; console.log(name); }
  • 6. var a = b = 0;
  • 7. In questo caso l'interprete riscrive il codice in questo modo: quindi "b" è globale. Da evitare! b = 0; var a = b;
  • 8. Questo pattern prevede di dichiarare tutte le variabili utilizzando un solo "var". Corretto! var a = 0, b = 0;
  • 10. "pluto" e "paperino" sono dichiarate in due momenti separati all'interno della funzione. Da evitare! function plutoAiutaPaperino() { var pluto = new Pluto(); pluto.corre(); pluto.mangia(); ... var paperino = new Paperino(); pluto.aiuta(paperino); }
  • 11. Più leggibile e evitiamo problemi legati all' "hoisting". Corretto! function plutoAiutaPaperino() { var pluto = new Pluto(), paperino = new Paperino(); pluto.corre(); pluto.mangia(); pluto.aiuta(paperino); }
  • 13. "i" in questo caso è globale. Se "list" è un array particolarmente grande il dover recuperare ad ogni iterazione il valore di "list.length" rallenta il codice. Da evitare! for(i = 0; i < list.length; i++) { // do something };
  • 14. "list.length" in questo caso viene "cachato" nella variabile "len". ( ) Corretto! for(var i = 0, len = list.length; i < len; i++) { // do something }; http://jsperf.com/loops
  • 16. "eval" esegue il codice javascript inserito in una stringa. Da evitare! eval('var i = "Welcome Hackers!"; alert(i);');
  • 17. Usare i costruttori predefiniti al posto della sintassi "literal".
  • 18. Qualsiasi cosa in Javascript è un Object, il linguaggio mette a disposizione dei costruttori che ereditano da Object implementando nuove funzionalità. "new Array()" ad esempio crea un oggetto di tipo Array con delle funzionalità come "pop","push","shift", etc. Da evitare! var disney = new Array("Pippo","Topolino","Paperino");
  • 19. Corretto! var disney = ["Pippo","Topolino","Paperino"]; Questa sintassi è molto più pulita e condivisa da gran parte dei linguaggi di programmazione.
  • 21. E' buona norma evitare di definire variabili o funzioni nello "scope globale" perchè sono accessibili e modificabili in qualsiasi punto dell'applicazione. C'è il rischio che vengano accidentalmente sovrascritte da altri programmatori o plugin esterni e rendono il codice difficile da mantenere.
  • 22. Da evitare! <script> var pluto = new Pluto(), plutoHouse = new DogHouse({color:red,material:'wood', size: [100,100 function loadPlutoHouse() { return pluto.load(house); } </script> Tutte le variabili definite nel frammento di codice sopra- riportato sono globali perchè non sono definite all'interno di una funzione.
  • 23. Usare una funzione che viene definita e subito invocata crea uno "scope isolato". Variabili e funzioni esistono solo all'interno dell' IIFE. Corretto! <script> // IIFE = Immediately-Invoked Function Expression (function(document, window, undefined){ var pluto = new Pluto(), plutoHouse = new DogHouse({color:red,material:'wood', size: [100 function loadPlutoHouse() { return pluto.load(house); } })(document,window); </script>
  • 24. Esempio in jQuery <script> // IIFE = Immediately-Invoked Function Expression (function($,document, window){ //code immediately executed goes here $(function(){ //code executed on document ready goes here }); })(jQuery, document,window, undefined); </script>
  • 27. Ogni volta che usiamo $('...') viene creato un nuovo oggetto jQuery parsando il DOM e cercando l'elemento corrispondente. Assolutamente poco performante. Da evitare! $('button.confirm').on('click', function() { // Do it once $('.modal').modal(); // And once more $('.modal').addClass('active'); // And again for good measure $('modal').css(...); });
  • 28. jQuery ci permette di "concatenare" più funzioni al medesimo oggetto $ perchè ogni funzione ritorna l'instanza dell'elemento DOM jquerizzato. Soluzione 1: Chaining $('button.confirm').on('click', function() { $('.modal') .modal() .addClass('active') .css(...); });
  • 29. Salvare il riferimento all'oggetto jQuery per poi riusarlo nel codice è la soluzione ottimale. In particolare all'interno dei listener evitiamo di dover "attraversare" il DOM ogni volta che si scatena l'evento a cui l'ascoltatore è associato. Soluzione 2: Caching var $buttonConfirm = $('button.confirm'), $modal = $('.modal'); $background = $('.bg-overlay'); $buttonConfirm.on('click', function() { $modal .modal() .addClass('active') .css(...); $background.removeClass('hidden'); });
  • 31. Annidare callback porta a codice difficile da capire e mantenere. Da evitare! $buttonConfirm.on('click', function() { $overlay.fadeIn(400, function(){ $.ajax('/some/modal/content',{},function(data){ $overlay.html(data).slideUp(300, function() { .... }) }) }) });
  • 32. Portare le funzioni all'esterno aiuta la leggibilità. Un pò meglio $buttonConfirm.on('click', showOverlay); function showOverlay() { $overlay.fadeIn(400, getOverlayDataFromServer); } function getOverlayDataFromServer() { $.ajax('/some/modal/content',{}, updateOverlayContent); } function updateOverlayContent(data) { $overlay.html(data).slideUp(300, function() { .... }) }
  • 33. Alcuni medoti jQuery ritornano direttamente un Deferred object, è possibile creare anche "azioni" custom che utilizzano $.Deferred. Deferred Objects $buttonConfirm.on('click', function(e){ $.when(showOverlay()) .then(getOverlayDataFromServer()) .done(updateOverlayContent(data)) .fail(function(){ alert("Something went wrong!") }); }); function showOverlay() { // $.fn.fadeIn has a promise() method defined so it works like a deferred return $overlay.fadeIn(400); } function getOverlayDataFromServer() { return $.ajax('/some/modal/content'); } function updateOverlayContent(data) {
  • 34. Linee guida (Tools per scrivere Javascript pulito)
  • 36. Con questa dicitura abilitiamo la modalità "Strict Mode": per alcuni sbagli (o cattive abitudini) normalmente accettati dall'interprete JS vengono sollevati errori. 'use strict'; function myFunction() { 'use strict'; //... }
  • 37. Usare un linter JS: JsHint
  • 38. Può essere usato sia come plugin nell'editor di testo sia all'interno del vostro task manager (Grunt/Gulp).
  • 40. Scegliere una StyleGuide e usare JSCS
  • 41. Ogni programmatore ha le sue abitudini, giuste o sbagliate che siano. Scegliere una styleguide e condividerla con il team di progetto è fontamentale per avere un codice omogeneo e "stilisticamente" pulito. AirBnB Google jQuery Idiomatic.js
  • 42. JSCS