javascript - make the right choices
DESCRIPTION
TRANSCRIPT
![Page 1: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/1.jpg)
JavaScriptmake the right choices
![Page 2: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/2.jpg)
Damian Wielgosik
![Page 3: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/3.jpg)
about me ;-)
![Page 5: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/5.jpg)
1. Begin with ECMAScript
![Page 6: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/6.jpg)
ECMAScript
![Page 7: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/7.jpg)
sometimes it’s difficult...
![Page 8: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/8.jpg)
... to speak in a human language
![Page 9: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/9.jpg)
... znaleźć ludzki językDmitry Soshnikov
your personal ECMAScript teacher
![Page 10: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/10.jpg)
Participate in the future!
![Page 11: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/11.jpg)
Harmony - the next ECMAScript standard
![Page 13: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/13.jpg)
mail-archive.com/[email protected]/info.html
![Page 15: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/15.jpg)
2. Know your tools
![Page 16: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/16.jpg)
Yes, we all know Firebug and Web Inspector
![Page 17: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/17.jpg)
Hurt your feelings with jslint.com
![Page 18: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/18.jpg)
Yes, we all know Firebug and Web Inspector
Aardwolf - mobile debugging made easy
![Page 19: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/19.jpg)
Memory stats?
![Page 20: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/20.jpg)
Memory?
WebKit Inspector
![Page 21: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/21.jpg)
Memory leaks?
![Page 22: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/22.jpg)
Memory leak checker
![Page 23: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/23.jpg)
Performance?
sIEeve
home.orange.nl/jsrosman/
![Page 24: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/24.jpg)
Memory leaks?
people.mozilla.com/~dbaron/leak-screencasts/
![Page 25: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/25.jpg)
Performance?
![Page 26: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/26.jpg)
var start = +new Date();for (var i = 0; i < 100000; i++);console.log("Result is: ", +new Date() - start);
![Page 27: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/27.jpg)
Better?
![Page 28: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/28.jpg)
console.time("My test"); for (var i = 0; i < 100000; i++); console.timeEnd("My test");
![Page 29: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/29.jpg)
Still better?
![Page 30: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/30.jpg)
console.profile("My test"); runApp();console.profileEnd("My test");
![Page 31: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/31.jpg)
The best?
![Page 32: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/32.jpg)
jsperf.com
jsperf.com
![Page 33: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/33.jpg)
jsperf measures operations per second!
![Page 34: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/34.jpg)
Get rid of jQuery if it’s not neccessary - there is http://microjs.com
![Page 35: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/35.jpg)
Hunt on new stuff!
![Page 37: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/37.jpg)
3. Tips and tricks
![Page 38: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/38.jpg)
it has to be said...
![Page 39: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/39.jpg)
do not optimize prematurely!
![Page 40: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/40.jpg)
do not optimize prematurely!
flickr.com/photos/paulmartincampbell/3583176306/sizes/o/in/photostream/
JavaScript !== Java
![Page 41: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/41.jpg)
var obj = {}; // not new Object()var arr = []; // not new Array();
![Page 42: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/42.jpg)
forget about your old habits!
![Page 43: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/43.jpg)
do not port bad solutions to JavaScript!(aka I don’t need yet another class system in JS)
![Page 44: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/44.jpg)
otherwise they’re gonna find you! ;-)
http://www.fotofaza.pl/podglad_zdjecia,15,ludzie,chuligani.html
![Page 45: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/45.jpg)
4. Real tips and tricks
![Page 46: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/46.jpg)
function calls cost time!
![Page 47: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/47.jpg)
use JS asynchronously when needed
![Page 48: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/48.jpg)
var arr = [ function() { console.log("A"); }, function() { throw new Error("boom!"); }, function() { console.log("B"); }, function() { console.log("C"); } ];
for (var i = 0, ilen = arr.length; i < ilen; i++) { arr[i]();}
![Page 49: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/49.jpg)
oops?
![Page 50: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/50.jpg)
![Page 51: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/51.jpg)
var arr = [ function() { console.log("A"); }, function() { throw new Error("boom!"); }, function() { console.log("B"); }, function() { console.log("C"); } ];
for (var i = 0, ilen = arr.length; i < ilen; i++) { window.setTimeout(arr[i], 0);}
![Page 52: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/52.jpg)
more interesting results
![Page 53: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/53.jpg)
var fn = function() { console.log("a"); fn();};fn();
![Page 54: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/54.jpg)
stack overflow?
![Page 55: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/55.jpg)
let’s write own scheduler
![Page 56: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/56.jpg)
var scheduler;(function() { var events = []; scheduler = { add : function(fn, delay) { for (var i = 0, ilen = events.length; i < ilen; i++) { if (events[i].fn === fn) { throw new Error("The event exists in the main event loop"); } } events.push({ fn : fn, delay: delay }); }, run: function() { for (var i = 0, ilen = events.length; i < ilen; i++) { (function(callback, delay) { var fn = function() { callback(); window.setTimeout(fn, delay); }; window.setTimeout(fn, delay); })(events[i].fn, events[i].delay); } } };})();
scheduler.add(function() { console.log("A"); }, 500); // it will call a function every 500msscheduler.add(function() { console.log("B"); }, 1000); // like above with 1000ms delayscheduler.run();
![Page 57: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/57.jpg)
one loop to handle similar events
![Page 58: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/58.jpg)
var eventLoop;(function() { var events = {}; eventLoop = { add : function(fn, delay) { if (!(delay in events)) { events[delay] = []; } else { for (var i = 0, ilen = events[delay].length; i < ilen; i++) { if (events[delay][i].fn === fn) { throw new Error("The event exists in the main event loop"); } } } events[delay].push(fn); }, run: function() { for (var delay in events) { (function(stack, delay) { var fn = function() { for (var i = 0, ilen = stack.length; i < ilen; i++) { stack[i](); } window.setTimeout(fn, delay); }; window.setTimeout(fn, delay); })(events[delay], delay); } } };})();
eventLoop.add(function() { console.log("A"); }, 500);eventLoop.add(function() { console.log("B"); }, 500);eventLoop.run();
![Page 59: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/59.jpg)
var eventLoop;(function() { var events = {}; eventLoop = { add : function(fn, delay) { if (!(delay in events)) { events[delay] = []; } else { for (var i = 0, ilen = events[delay].length; i < ilen; i++) { if (events[delay][i].fn === fn) { throw new Error("The event exists in the main event loop"); } } } events[delay].push(fn); }, run: function() { for (var delay in events) { (function(stack, delay) { var fn = function() { for (var i = 0, ilen = stack.length; i < ilen; i++) { stack[i](); } window.setTimeout(fn, delay); }; window.setTimeout(fn, delay); })(events[delay], delay); } } };})();
eventLoop.add(function() { console.log("A"); }, 500);eventLoop.add(function() { console.log("B"); }, 500);eventLoop.run();
we don’t want to end up with big array indexes - we use the object instead of array
we have never added events for this delay so let’s make an array to store them
let’s store a single event by that
![Page 60: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/60.jpg)
yep, you have to implement stop() method
![Page 61: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/61.jpg)
Timers can be useful with AJAX requests
![Page 62: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/62.jpg)
var throttle = function(fn, delay) { var timer = null; return function () { var context = this; var args = arguments; clearTimeout(timer); timer = setTimeout(function () { fn.apply(context, args); }, delay); };};
$('input.username').keypress(throttle(function (event) { // do the Ajax request}, 250));
http://remysharp.com/2010/07/21/throttling-function-calls/
![Page 63: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/63.jpg)
parseInt(„09”) === 0
![Page 64: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/64.jpg)
JS thinks „09” is an octal number because it starts with 0
![Page 65: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/65.jpg)
parseInt(„09”, 10) === 9
![Page 66: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/66.jpg)
However,parseFloat(„09”) === 9
![Page 67: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/67.jpg)
However,parseFloat(„09”) === 9
![Page 68: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/68.jpg)
document.querySelectorAll("div")returns a NodeList
not an array
![Page 69: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/69.jpg)
var nodes = document.querySelectorAll("div");nodes = [].slice.apply(nodes);
![Page 70: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/70.jpg)
However:„Whether the slice function can be applied successfully to a host object is
implementation-dependent.” - ECMAScript
![Page 71: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/71.jpg)
Speaking of which, how to check if it’s an array?
![Page 72: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/72.jpg)
var arr = [];arr instanceof Array;
![Page 73: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/73.jpg)
Really?
![Page 74: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/74.jpg)
var Array = function() {};var arr = [];arr instanceof Array; // FALSE!
![Page 75: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/75.jpg)
Next?
![Page 76: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/76.jpg)
var arr = [];if ("length" in arr) { // we deal with an array}
![Page 77: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/77.jpg)
Really?
![Page 78: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/78.jpg)
var arr = { "length": 2 };if ("length" in arr) { // we deal with an array... wait a moment!}
![Page 79: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/79.jpg)
Next?
![Page 80: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/80.jpg)
var arr = [];if (Object.prototype.toString.call(arr) === "[object Array]") { // Houston, we have an array}
![Page 81: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/81.jpg)
Ok, but well, you can still modify a toString fn...
![Page 82: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/82.jpg)
Object.prototype.toString = function() { return "";};
![Page 83: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/83.jpg)
Here we go... ECMAScript 5!
![Page 84: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/84.jpg)
var arr = [];if (Array.isArray(arr)) { // w00t!}
![Page 85: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/85.jpg)
Hey, I can still replace it with my own stuff!
![Page 86: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/86.jpg)
Array.isArray = function() { return false;}
![Page 87: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/87.jpg)
Cache the most important functions at the very beginning!
![Page 88: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/88.jpg)
(function() { var isArray = Array.isArray;})();
![Page 89: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/89.jpg)
Or.. if you can, use ECMAScript 5 again
![Page 90: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/90.jpg)
Object.defineProperty(Array, "isArray", { writable: false, configurable: false, enumerable: false, value: Array.isArray}); // thx to @marcoos
![Page 91: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/91.jpg)
Hey, what is that ECMAScript 5 actually?
![Page 92: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/92.jpg)
Hey, what is that ECMAScript actually?
![Page 93: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/93.jpg)
Hey, we’re on mobile, do you have something for us?
![Page 94: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/94.jpg)
yes, I can! Oh, I do.
![Page 95: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/95.jpg)
Use window.scrollTo(0, 1) to get rid of the browser address bar on iOS!
![Page 96: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/96.jpg)
/mobile/i.test(navigator.userAgent) && !location.hash && setTimeout(function () { if (!pageYOffset) window.scrollTo(0, 1);}, 1000);
thanks to amazing work by Remy Sharphttp://remysharp.com/2010/08/05/doing-it-right-skipping-
the-iphone-url-bar/
![Page 97: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/97.jpg)
More?
![Page 98: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/98.jpg)
Visit JSNews on Facebook for more awesomenesshttp://tinyurl.com/jsnewspl
![Page 99: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/99.jpg)
or attend Front-Trends 2012 conferencehttp://front-trends.com
http://lanyrd.com/2012/ft2012/
![Page 100: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/100.jpg)
but first of all, be smart and listen to smart people - there is a lot on the web
![Page 101: JavaScript - Make the right choices](https://reader034.vdocuments.us/reader034/viewer/2022051611/54b79ec34a79590e758b45e7/html5/thumbnails/101.jpg)
Thanks!Slides at:
http://varjs.com/make-right-choices