Javascript the Interlingua of the Web

Post on 12-May-2015

5.755 views 1 download

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.

Transcript of Javascript the Interlingua of the Web

JavascriptThe Interlingua of the Web

http://anders.janmyr.comanders.janmyr@jayway.com

@andersjanmyr

Anders Janmyr

Monday, October 4, 2010

Ugly Javascript

Monday, October 4, 2010

Beautiful Javascript

Monday, October 4, 2010

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

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

Object

Dynamic

Monday, October 4, 2010

Object

Hashtable

Monday, October 4, 2010

Object

Prototypical

Monday, October 4, 2010

Object Literal

var empty_object = {};

Monday, October 4, 2010

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

Monday, October 4, 2010

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

Monday, October 4, 2010

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

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

Monday, October 4, 2010

Retrieving non-existent properties

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

Monday, October 4, 2010

Setting non-existent properties

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

kjell.firstname // 'Sven'

Monday, October 4, 2010

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

rudolph.name // “Kjell”

Monday, October 4, 2010

Prototypical Inheritance

name Kjell

kind Malayan

id a4r54ed

prototype

Monday, October 4, 2010

rudolph.name = 'Rudolph';

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

rudolph.kind // ‘Malayan’

Monday, October 4, 2010

kjell.kind = 'Baird';

rudolph.kind // ‘Baird’

rudolph.kind // ‘Malayan’

Monday, October 4, 2010

delete rudolph.name

rudolph.name // ‘Kjell’

Monday, October 4, 2010

Prototypical Inheritance

new Constructor();

Returns a new object with a link to

Constructor.prototype

Monday, October 4, 2010

Prototypical Inheritance

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

Monday, October 4, 2010

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

Array Literals

• [ ]

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

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

Monday, October 4, 2010

Array Methods

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

Monday, October 4, 2010

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

Function

First class object

Monday, October 4, 2010

Function

function() {};

lambda

Monday, October 4, 2010

Function Statement

function foo() {}

expands to

var foo = function foo() {};

Monday, October 4, 2010

Functions

Can be defined inside other functions!

Monday, October 4, 2010

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

Methods

functions stored in objects

Monday, October 4, 2010

Built-in Prototypes

• Object.prototype

• Array.prototype

• Function.prototype

• Number.prototype

• String.prototype

Monday, October 4, 2010

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

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

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

}

Monday, October 4, 2010

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

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

Monday, October 4, 2010

Dynamics

Monday, October 4, 2010

Scope

The function is the scope of the variables

Monday, October 4, 2010

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

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

arguments

• A special array like, DYNAMIC, parameter

• All the arguments of the invocation

Monday, October 4, 2010

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

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

Global Object• Container for all variables

• On browsers window == global

• Any var not declared is global

• Global variables are Dangerous

Monday, October 4, 2010

Good Practices

Monday, October 4, 2010

Modules

var MyNamespace = {};

var MyNS = MyNS || {};

Monday, October 4, 2010

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

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

Monday, October 4, 2010

Encapsulationvar Esperanto = Esperanto || {};

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

Monday, October 4, 2010

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

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

Mixins

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

Monday, October 4, 2010

Test

• QUnit

• JsTest

• ScrewUnit

• jSpec

• ...

Monday, October 4, 2010

jQuerywrite less, do more.

Monday, October 4, 2010

Monday, October 4, 2010

jQuery Philosophy

• Find some HTML

• Do something to it

Monday, October 4, 2010

Find some HTML$(“div”)

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

Monday, October 4, 2010

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

Document Ready

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

Monday, October 4, 2010

Tools

Monday, October 4, 2010

Debuggers

• Firebug

• Apple Dev Tools

• Chrome Dev Tools

• Internet Explorer Developer Tools

Monday, October 4, 2010

CSS Tools

• http://codylindley.com/jqueryselectors/

• Selector Gadget

• Nokogiri• XML, HTML, SAX Parser

Monday, October 4, 2010

Build Tools

• Rake

• SCons

• Ant

• Scripts

Monday, October 4, 2010

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

Monday, October 4, 2010

DemoBrowser Command Line

• jQuery (10 lines)

• Sinatra (10 lines)

• LiveReload

Monday, October 4, 2010