write better javascript

54
Kevin Whinnery Engineer and Platform Evangelist Appcelerator, Inc. @kevinwhinnery Write Better JavaScript

Upload: kevin-whinnery

Post on 15-May-2015

3.614 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Write Better JavaScript

Kevin WhinneryEngineer and Platform Evangelist

Appcelerator, Inc.

@kevinwhinnery

Write Better JavaScript

Page 2: Write Better JavaScript

Kevin WhinneryEngineer and Platform EvangelistAppcelerator since 2008

Husband and father of three:

Web developer and JavaScript slinger turned mobile and desktop hacker.

http://kevinwhinnery.comhttp://twitter.com/kevinwhinneryhttp://github.com/kwhinnery

Page 3: Write Better JavaScript

Agenda

• The Good Parts and Bad Parts

• Object-Oriented Programming in JavaScript

• Useful JavaScript Patterns, Tricks, and Style Guidelines

• JavaScript in Titanium Mobile

• Further Reading

Page 4: Write Better JavaScript

JavaScript is a tragically

misunderstood language.

Page 5: Write Better JavaScript

“JavaScript is the incredibly hot girl at the party that brings her loser boyfriend

DOM”

Tom RobinsonFounder, 280 North

Page 6: Write Better JavaScript

JavaScript – What is it good for?• Absolutely nothing? Far from it…

• Object-Oriented (Prototypical Inheritance)… or not

• Flexible Objects

• First-Class Functions

• Built for event-driven UI

Page 7: Write Better JavaScript

JavaScript: The Good Parts

• Published In 2008 by Doug Crockford

• Covers the good and bad

• I use patterns from this book every time I write JS

• Buy/read/love

Page 8: Write Better JavaScript

Some Bad Parts

Page 9: Write Better JavaScript

Global Variables

app.js

some/library.js

Page 10: Write Better JavaScript

Truthy and Falsy

• Falsy Values:• false• 0• ‘’• null• undefined• NaN

• Truthy Values:• Everything else

• Almost always, you want === and !==

Page 11: Write Better JavaScript

Floating Point Arithmetic

Avoid this by converting to whole numbers, and converting back to decimal.

Page 12: Write Better JavaScript

typeof is a liar

Page 13: Write Better JavaScript

there’s more (http://wtfjs.com ), but let’s skip to…

Page 14: Write Better JavaScript

The Good Parts

Page 15: Write Better JavaScript

Expressive Object Literals

Page 16: Write Better JavaScript

Easy Object Serialization

Page 17: Write Better JavaScript

First Class Functions

Page 18: Write Better JavaScript

Closures

Page 19: Write Better JavaScript

Flexible Objects

Page 20: Write Better JavaScript

Duck Typing

Page 21: Write Better JavaScript

…plus it’s EVERYWHERE.one could develop all kinds of

software applications with nothing else.

Page 22: Write Better JavaScript

OOP!(There it is!)

Page 23: Write Better JavaScript

JavaScript has Prototypal Inheritance, which creates new

copies of objects from an existing object (the prototype)

there’s much more to it than this, but we’ll keep it mostly high level…

Page 24: Write Better JavaScript

Object Constructors

* The capital first letter is by convention, not requirement.

Page 25: Write Better JavaScript

Object Prototype

Page 26: Write Better JavaScript

we could have also wrote…

Page 27: Write Better JavaScript

…but object instantiation using the prototype to define

functions/properties is faster.

http://ejohn.org/blog/simple-class-instantiation mentions this and other methods for…

Page 28: Write Better JavaScript

Inheritance (One Approach)

Page 29: Write Better JavaScript

JavaScript doesn’t support multiple inheritance, but there

are multiple libraries that handle that and more, including

underscore.js

http://documentcloud.github.com/underscore/#extend

Page 30: Write Better JavaScript

Parasitic Inheritance

• Create an existing object

• Add new features and functionality to it (the parasites, if you will)

• Pass it off as an instance of a new object

• Slightly slower than .prototype but more flexible (and inescapable in certain cases)

Page 31: Write Better JavaScript

Parasitic Inheritance

Page 32: Write Better JavaScript

Useful Tricks

Page 33: Write Better JavaScript

Self-Calling Function

• Function scope is the only scope in JavaScript

• Self-calling function provides encapsulation

• Both forms at right are valid, second is preferred

Page 34: Write Better JavaScript

Module Pattern

• Necessary for <script> in the browser or Ti.include

• Uses functional scope to provide a public interface to a module

• Tweetanium/Training demos use a version of this

Page 35: Write Better JavaScript

Dynamic Function Signatures

• Not necessary to explicitly name parameters

• Function interfaces can rationalize many input types

• jQuery does this well, and is very popular b/c of its API

Page 36: Write Better JavaScript

Call And Apply

• Functions are first class objects

• Passable, and callable

• Can replace “this” inside function with something more useful

• call: call a function with known arguments

• apply: call a function with an array of arguments

Page 37: Write Better JavaScript

Apply Example

Page 38: Write Better JavaScript

Call Example

Page 39: Write Better JavaScript

A More Useful “this”

Page 40: Write Better JavaScript

Style Guidelines

Page 41: Write Better JavaScript

Style “Dos”

• Use descriptive variable names (exception: well-understood, frequently typed modules/libraries, like “Ti” or “_” for Underscore.js)

• JavaScript file contents (cohesion)

• Google Style Guidelines: http://bit.ly/g_style

• Follow the above and you are good to go

Page 42: Write Better JavaScript

Style “Don’ts”

• terse local variable names – excuse me if I don’t know what “tvr” means inside your 300 line constructor

• Huge files – if you want to write 13,000 lines in a file, go back to enterprise Java

• Semicolons are not optional – you don’t want the interpreter writing code for you

• and these monstrosities…

Page 43: Write Better JavaScript

Curly braces on the next line

*this style will actually break in some environments (semicolon insertion)

Page 44: Write Better JavaScript

Unnecessary Indentation

Page 45: Write Better JavaScript

JavaScript in Titanium Mobile

Page 46: Write Better JavaScript

JavaScript Engines

• iOS – JavaScriptCore – C-based, pretty darn fast

• Android – Rhino – Java-based, meant for the server-side, just okay in terms of performance

• Coming soon – Android/V8 – C-based, super duper fast, minimum Android version 2.2 (don’t freak out, check the version distribution stats)

• Android: Very important not to load all scripts up front in large applications (slow)

Page 47: Write Better JavaScript

Titanium Features

• Built-in JSON serialization

• CommonJS Module Spec

• Proxy objects are special – what’s a proxy? A stand-in for a native object, like anything you get back from something like:

Page 48: Write Better JavaScript

What’s special about proxies?

• You can’t modify the prototype

• You can’t add functions or properties that start with “get” or “set” – these are magic in Titanium proxies:

Page 49: Write Better JavaScript

Further Reading

Page 50: Write Better JavaScript

Books and Reference

• Mozilla Developer Network JavaScript Reference

• JavaScript: The Good Parts

• Eloquent JavaScript (free!)

• High Performance JavaScript

• JavaScript Patterns

Page 51: Write Better JavaScript

Not Exhaustive “Must Follow” List• @kevinwhinnery • @BrendanEich• @functionsource• @dalmaer• @thomasfuchs• @zacharyjohnson• @wycats• @DavidKaneda• @rem• @dawsontoth (Titanium

goodness)

Page 52: Write Better JavaScript

Potpourri

• http://javascriptweekly.com - seriously, stop what you’re doing and go there right now

• http://badassjs.com - then, after that, go here

• http://jsbin.com - handy test harness

• https://github.com/cjohansen/juicer - Great compression and obfuscation utility (Ruby)

• http://crockford.com - Pay your respects

Page 53: Write Better JavaScript

Questions?

Page 54: Write Better JavaScript

Thank You!