Slide 1

Slide 1 text

JAVASCRIPT ANTI-PATTERNS Moving from Java to JavaScript Wednesday, 2 May 2012

Slide 2

Slide 2 text

EQUALITY AND IDENTITY Wednesday, 2 May 2012

Slide 3

Slide 3 text

if (accountBalance == 0) { rejectTransfer(); } else { acceptTransfer(); } Wednesday, 2 May 2012

Slide 4

Slide 4 text

if (accountBalance == 0) { rejectTransfer(); } else { acceptTransfer(); } Wednesday, 2 May 2012

Slide 5

Slide 5 text

“JavaScript has two sets of equality operators: === and !==, and their evil twins == and !=” D. Crockford - “JavaScript: The Good Parts” Wednesday, 2 May 2012

Slide 6

Slide 6 text

Equality (==) versus Identity (===) Wednesday, 2 May 2012

Slide 7

Slide 7 text

'' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' \t\r\n ' == 0 // true Wednesday, 2 May 2012

Slide 8

Slide 8 text

SCOPE Wednesday, 2 May 2012

Slide 9

Slide 9 text

The Infamous Loop Problem Wednesday, 2 May 2012

Slide 10

Slide 10 text

function addLinks () { for (var i=0, link; i<5; i++) { link = document.createElement("a"); link.innerHTML = "Link " + i; link.onclick = function () { alert(i); }; document.body.appendChild(link); } } Wednesday, 2 May 2012

Slide 11

Slide 11 text

Wednesday, 2 May 2012

Slide 12

Slide 12 text

“...unlike C, C++, and Java, JavaScript does not have block-level scope. All variables declared in a function, no matter where they are declared, are defined throughout the function.” D. Flanagan “JavaScript: The Definitive Guide” Wednesday, 2 May 2012

Slide 13

Slide 13 text

function addLinks () { var i; for (i=0, link; i<5; i++) { link = document.createElement("a"); link.innerHTML = "Link " + i; link.onclick = function () { alert(i); }; document.body.appendChild(link); } } Wednesday, 2 May 2012

Slide 14

Slide 14 text

function addLinks () { for (var i=0, link; i<5; i++) { link = document.createElement("a"); link.innerHTML = "Link " + i; link.onclick = function (num) { return function () { alert(num); } }(i); document.body.appendChild(link); } } Wednesday, 2 May 2012

Slide 15

Slide 15 text

GLOBAL STATE Wednesday, 2 May 2012

Slide 16

Slide 16 text

messages = []; var elem = document.getElementById("messages"); elem.onclick = function () { var field = document.getElementById("input"); messages.push(field.value); }; Wednesday, 2 May 2012

Slide 17

Slide 17 text

messages = []; is equivalent to.... public static string[] messages; Wednesday, 2 May 2012

Slide 18

Slide 18 text

Why Global Variables Should Be Avoided When Unnecessary... • Non-locality • No Access Control or Constraint Checking • Implicit coupling • Concurrency issues • Namespace pollution • Memory allocation issues • Testing and Confinement http://c2.com/cgi/wiki?GlobalVariablesAreBad Wednesday, 2 May 2012

Slide 19

Slide 19 text

var messages = []; var elem = document.getElementById("messages"); var onclick = function (messages) { return function () { var field = document.getElementById("input"); messages.push(field.value); }; }; elem.onclick = onclick(messages); Wednesday, 2 May 2012

Slide 20

Slide 20 text

CLASS-ITUS Wednesday, 2 May 2012

Slide 21

Slide 21 text

function PersonDetails() { } PersonDetails.prototype = {}; PersonDetails.prototype.setAge = function (age) { this.age = age; }; PersonDetails.prototype.getAge = function () { return this.age; }; PersonDetails.prototype.setName = function (name) { this.name = name; }; PersonDetails.prototype.getName = function () { return this.name; }; var details = new PersonDetails(); details.setAge(28); details.setName("James Thomas"); updateDetailsForPerson(details); Wednesday, 2 May 2012

Slide 22

Slide 22 text

There’s a shorter way.... Wednesday, 2 May 2012

Slide 23

Slide 23 text

updateDetailsForPerson({ age: 28, name: "James Thomas" }); Wednesday, 2 May 2012

Slide 24

Slide 24 text

“You have no privacy. Get over it.” Scott McNealy Wednesday, 2 May 2012

Slide 25

Slide 25 text

PERFORMANCE Wednesday, 2 May 2012

Slide 26

Slide 26 text

function addClasses(element, classes) { for (var i = 0; i < classes.length; i++) { element.className += " " + classes[i]; } } Wednesday, 2 May 2012

Slide 27

Slide 27 text

“Reflow is the name of the web browser process for re-calculating the positions and geometries of elements in the document, for the purpose of re-rendering part or all of the document.” https://developers.google.com/speed/articles/reflow Wednesday, 2 May 2012

Slide 28

Slide 28 text

“Reflows are very expensive in terms of performance, and is one of the main causes of slow DOM scripts.” http://dev.opera.com/articles/view/efficient-javascript/?page=3#reflow Wednesday, 2 May 2012

Slide 29

Slide 29 text

http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/ •Adding, removing, updating DOM nodes •Hiding a DOM node with display: none (reflow and repaint) or visibility: hidden (repaint only, because no geometry changes) •Moving, animating a DOM node on the page •Adding a stylesheet, tweaking style properties •User action such as resizing the window, changing the font size or scrolling Wednesday, 2 May 2012

Slide 30

Slide 30 text

function addClasses(element, classes) { var newClasses = ""; for (var i = 0; i < classes.length; i++) { newClasses += " " + classes[i]; } element.className += newClasses; } Wednesday, 2 May 2012

Slide 31

Slide 31 text

Wednesday, 2 May 2012