66
Javascript The Interlingua of the Web http://anders.janmyr.com [email protected] @andersjanmyr Anders Janmyr Monday, October 4, 2010

Javascript the Interlingua of the Web

Embed Size (px)

DESCRIPTION

Javascript is one of the worlds most used programming languages. Yet, most programmers dislike it and it is treated like a second class citizen. The Javascript language has a reputation of being an ugly programming language and to some extent rightfully so, but under the ugly surface is a beautiful programming language with lambdas and closures. In this presentation you will learn to use Javascript, functional programming techniques, and some useful tools.

Citation preview

Page 1: Javascript the Interlingua of the Web

JavascriptThe Interlingua of the Web

http://[email protected]

@andersjanmyr

Anders Janmyr

Monday, October 4, 2010

Page 2: Javascript the Interlingua of the Web

Ugly Javascript

Monday, October 4, 2010

Page 3: Javascript the Interlingua of the Web

Beautiful Javascript

Monday, October 4, 2010

Page 4: Javascript the Interlingua of the Web

Y-CombinatorScheme (Lisp)

(define Y (lambda (X) ((lambda (procedure) (X (lambda (arg)

((procedure procedure) arg))))

(lambda (procedure) (X (lambda (arg)

((procedure procedure) arg)))))))

Monday, October 4, 2010

Page 5: Javascript the Interlingua of the Web

Y-CombinatorJavascript

function Y (X) { return (function(procedure) { return X(function(arg) { return procedure(procedure)(arg); }); })(function(procedure) { return X(function(arg) { return procedure(procedure)(arg); }); });}

Monday, October 4, 2010

Page 6: Javascript the Interlingua of the Web

Object

Dynamic

Monday, October 4, 2010

Page 7: Javascript the Interlingua of the Web

Object

Hashtable

Monday, October 4, 2010

Page 8: Javascript the Interlingua of the Web

Object

Prototypical

Monday, October 4, 2010

Page 9: Javascript the Interlingua of the Web

Object Literal

var empty_object = {};

Monday, October 4, 2010

Page 10: Javascript the Interlingua of the Web

var kjell = { name: "Kjell", "kind": "Malayan"};

Monday, October 4, 2010

Page 11: Javascript the Interlingua of the Web

var kjell = { name: "Kjell", "kind": "Malayan" address: { country: "Denmark" }};

Monday, October 4, 2010

Page 12: Javascript the Interlingua of the Web

Retrievalkjell.name // “Kjell”kjell["name"] // “Kjell”

// Denmarkkjell.address.country kjell['address']["country"]

Monday, October 4, 2010

Page 13: Javascript the Interlingua of the Web

Retrieving non-existent properties

kjell.firstname // undefinedkjell["NAME"] // undefinedkjell.home.country // Error

Monday, October 4, 2010

Page 14: Javascript the Interlingua of the Web

Setting non-existent properties

kjell.firstname = 'Sven';kjell["NAME"] = 'SVEN';

kjell.firstname // 'Sven'

Monday, October 4, 2010

Page 15: Javascript the Interlingua of the Web

Prototypical Inheritance using Object.createvar rudolph = Object.create(kjell);

rudolph.name // “Kjell”

Monday, October 4, 2010

Page 16: Javascript the Interlingua of the Web

Prototypical Inheritance

name Kjell

kind Malayan

id a4r54ed

prototype

Monday, October 4, 2010

Page 17: Javascript the Interlingua of the Web

rudolph.name = 'Rudolph';

rudolph.name // “Rudolph”kjell.name // “Kjell”

rudolph.kind // ‘Malayan’

Monday, October 4, 2010

Page 18: Javascript the Interlingua of the Web

kjell.kind = 'Baird';

rudolph.kind // ‘Baird’

rudolph.kind // ‘Malayan’

Monday, October 4, 2010

Page 19: Javascript the Interlingua of the Web

delete rudolph.name

rudolph.name // ‘Kjell’

Monday, October 4, 2010

Page 20: Javascript the Interlingua of the Web

Prototypical Inheritance

new Constructor();

Returns a new object with a link to

Constructor.prototype

Monday, October 4, 2010

Page 21: Javascript the Interlingua of the Web

Prototypical Inheritance

Object.create = function(o) { function F() {} F.prototype = o; return new F();}

Monday, October 4, 2010

Page 22: Javascript the Interlingua of the Web

Arrays

• Array inherits from object

• Indexes are converted to strings

• Magic length property• Always one larger than the highest int

property

Monday, October 4, 2010

Page 23: Javascript the Interlingua of the Web

Array Literals

• [ ]

• names = [ ʻRudolphʼ, ʻKjellʼ, ʻTorstenʼ]

• typeof value == ʻobjectʼ• value.constructor === Array

Monday, October 4, 2010

Page 24: Javascript the Interlingua of the Web

Array Methods

• concat• join• pop• push• slice• sort• splice

Monday, October 4, 2010

Page 25: Javascript the Interlingua of the Web

JSON{ "version": "1.0", "markets": [ { "name": "Europe", "currency": "EUR"}, { "name": "North America", "currency": "USD"}, { "name": "Other", "currency": "USD"} ], "serviceTypes": ["Maintenence", "WearingPart"], "valueTypes": ["Market value", "Trade in value"]}

Monday, October 4, 2010

Page 26: Javascript the Interlingua of the Web

Function

First class object

Monday, October 4, 2010

Page 27: Javascript the Interlingua of the Web

Function

function() {};

lambda

Monday, October 4, 2010

Page 28: Javascript the Interlingua of the Web

Function Statement

function foo() {}

expands to

var foo = function foo() {};

Monday, October 4, 2010

Page 29: Javascript the Interlingua of the Web

Functions

Can be defined inside other functions!

Monday, October 4, 2010

Page 30: Javascript the Interlingua of the Web

residualValues: function(cur) { var self = this; return function() { return [1,2,3,4,5].map(function(age) { return { years: age, value: self.tradePercent(cur, age) }; }); }}

Monday, October 4, 2010

Page 31: Javascript the Interlingua of the Web

Methods

functions stored in objects

Monday, October 4, 2010

Page 32: Javascript the Interlingua of the Web

Built-in Prototypes

• Object.prototype

• Array.prototype

• Function.prototype

• Number.prototype

• String.prototype

Monday, October 4, 2010

Page 33: Javascript the Interlingua of the Web

Array.prototype.contains = function(element) { for (var i = 0; i < this.length; i++) { if (this[i] == element) return true; } return false;}

[1, 2, 3].contains(3); // true

Monday, October 4, 2010

Page 34: Javascript the Interlingua of the Web

Function.prototype.method = function(name, func) {

this.prototype[name] = func;return this;

}

Monday, October 4, 2010

Page 35: Javascript the Interlingua of the Web

String.method(‘trim’, function() { return this.replace(/^\s+|\s+$/g, ‘’);}

“ tapir “.trim(); // “tapir”

Monday, October 4, 2010

Page 36: Javascript the Interlingua of the Web

Dynamics

Monday, October 4, 2010

Page 37: Javascript the Interlingua of the Web

Scope

The function is the scope of the variables

Monday, October 4, 2010

Page 38: Javascript the Interlingua of the Web

Invocation Forms• Function form• sleep(10)

• Method form• kjell.sleep(10) • kjell[“sleep”](10)

• Constructor form• new sleep(10)

• Apply form• sleep.apply(rudolph, 10)

Monday, October 4, 2010

Page 39: Javascript the Interlingua of the Web

thisInvocation

Formthis

functionthe global

object

method kjell

constructor a new object

apply rudolph

this is an extra dynamic

parameter that depends on the

calling form

Monday, October 4, 2010

Page 40: Javascript the Interlingua of the Web

arguments

• A special array like, DYNAMIC, parameter

• All the arguments of the invocation

Monday, October 4, 2010

Page 41: Javascript the Interlingua of the Web

function sum() { var i, n = arguments.length, total = 0; for (i = 0; i < n; i += 1) { total += arguments[i]; } return total;}

sum(1, 2, 3, 4);

Monday, October 4, 2010

Page 42: Javascript the Interlingua of the Web

Dynamic Compilation

• eval• Evaluates a string and returns the result.

• new Function(parameterArray, codeString)• Creates and returns a function.• var add=new Function("a", "b", "return a+b;");

Monday, October 4, 2010

Page 43: Javascript the Interlingua of the Web

Global Object• Container for all variables

• On browsers window == global

• Any var not declared is global

• Global variables are Dangerous

Monday, October 4, 2010

Page 44: Javascript the Interlingua of the Web

Good Practices

Monday, October 4, 2010

Page 45: Javascript the Interlingua of the Web

Modules

var MyNamespace = {};

var MyNS = MyNS || {};

Monday, October 4, 2010

Page 46: Javascript the Interlingua of the Web

CascadesetFirst: function(name) { this.first = name; return this;}

person.setFirst(“Anders”).setLast(“Janmyr”).setAge(40);

Monday, October 4, 2010

Page 47: Javascript the Interlingua of the Web

Encapsulationvar Esperanto = Esperanto || {};

Esperanto.Lab = function() { var privVar = "example"; function privFunc() { return privVar; } return { example: function() { return privFunc(); } }}()

Monday, October 4, 2010

Page 48: Javascript the Interlingua of the Web

Local FunctionscostData: function(current) { var data = {}; function addEntry(name, cost) { data[name + "PerHour"] = model.withTwoDec(cost/hours); data[name] = model.noDecimalsWithSeparator(cost); };

addEntry("interest", this.financialCost(current)), addEntry("depreciation", this.depreciationCost(current)), return data;},

Monday, October 4, 2010

Page 49: Javascript the Interlingua of the Web

self = this

attachFormListener: function(form, object) { var self = this; function populator(event) { self.populateFromForm(form, object); object.notify(); }; form.getElements().each(function(child) { child.observe('change', populator); });},

Monday, October 4, 2010

Page 50: Javascript the Interlingua of the Web

Mixins

Object.mixin = function(destination, source) { for (property in source) destination[property] = source[property]; return destination;}

Monday, October 4, 2010

Page 51: Javascript the Interlingua of the Web

Test

• QUnit

• JsTest

• ScrewUnit

• jSpec

• ...

Monday, October 4, 2010

Page 52: Javascript the Interlingua of the Web

jQuerywrite less, do more.

Monday, October 4, 2010

Page 53: Javascript the Interlingua of the Web

Monday, October 4, 2010

Page 54: Javascript the Interlingua of the Web

jQuery Philosophy

• Find some HTML

• Do something to it

Monday, October 4, 2010

Page 55: Javascript the Interlingua of the Web

Find some HTML$(“div”)

<html> <body> <div>Malayan Tapir</div> <div>Baird Tapir</div></body> </html>

Monday, October 4, 2010

Page 56: Javascript the Interlingua of the Web

Do something to it!$(“div”).addClass(‘cool’);

<html> <body> <div class=‘cool’>Malayan Tapir</div> <div class=‘cool’>Baird Tapir</div></body> </html>

Monday, October 4, 2010

Page 57: Javascript the Interlingua of the Web

Document Ready

$(function(){ // Document is ready});

Monday, October 4, 2010

Page 58: Javascript the Interlingua of the Web

Tools

Monday, October 4, 2010

Page 59: Javascript the Interlingua of the Web

Debuggers

• Firebug

• Apple Dev Tools

• Chrome Dev Tools

• Internet Explorer Developer Tools

Monday, October 4, 2010

Page 60: Javascript the Interlingua of the Web

CSS Tools

• http://codylindley.com/jqueryselectors/

• Selector Gadget

• Nokogiri• XML, HTML, SAX Parser

Monday, October 4, 2010

Page 62: Javascript the Interlingua of the Web

Build Tools

• Rake

• SCons

• Ant

• Scripts

Monday, October 4, 2010

Page 63: Javascript the Interlingua of the Web

File Watchers

• xrefresh for Firefox and IE• http://xrefresh.binaryage.com/

• LiveReload for Safari and Chrome• http://github.com/mockko/livereload

• Watchr• gem install watchr

Monday, October 4, 2010

Page 64: Javascript the Interlingua of the Web

Monday, October 4, 2010

Page 65: Javascript the Interlingua of the Web

DemoBrowser Command Line

• jQuery (10 lines)

• Sinatra (10 lines)

• LiveReload

Monday, October 4, 2010