advanced javascript · javascript vs. browsers ‣ javascript originated in netscape as...

42
Konstantin Käfer Advanced JavaScript Konstantin Käfer

Upload: others

Post on 20-Jun-2020

19 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Advanced JavaScriptKonstantin Käfer

Page 2: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Contents1. Why JavaScript?

2. Advanced Language Features

3. Patterns and Techniques

4. Debugging and Analyzing

Page 3: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Why JavaScript?‣ Lightweight language

‣ No static type system

‣ Functions as first class objects

‣ Because you have to.

1. Why JavaScript?

Page 4: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

JavaScript vs. the DOM‣ Often confused

‣ DOM: API for accessing a web page

‣ The DOM is not JavaScript specific

‣ The DOM has a bad reputation:

‣ Incompatibilities between browsers

‣ Verbose syntax

‣ Inconvenient to use

1. Why JavaScript?

Page 5: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

JavaScript vs. browsers‣ JavaScript originated in Netscape as “LiveScript”

‣ JavaScript is not specific to browsers

‣ Other uses:

‣ Scripting Mozilla’s interface

‣ Scripting Adobe applications

‣ Used as a base for ActionScript

‣ Server-side JavaScript

1. Why JavaScript?

Page 6: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Demo: AppJet

1. Why JavaScript?

Page 7: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Other uses‣ 3D rendering in the browser

‣ Reading ID3 tags from MP3 files

‣ Implementing a programming languagehttp://ejohn.org/blog/processingjs/

1. Why JavaScript?

Page 8: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Contents1. Why JavaScript?

2. Advanced Language Features

3. Patterns and Techniques

4. Debugging and Analyzing

2. Advanced Language Features

Page 9: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Functions‣ Functions are first class entities

‣ Store in variables, pass as parameters, return from functions

‣ Can be defined at any place

‣ Functions can contain properties

‣ Anonymous functions

‣ Closures

2. Advanced Language Features

Page 10: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

function() { print("Passed function called");}

Functions (II)

var foo = function(callback) {

};

2. Advanced Language Features

foo(

)();

foo.bar = "baz";

callback(); return function() { print("Returned function called"); };

Page 11: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Prototypal OOP2. Advanced Language Features

‣ JavaScript doesn’t have classes

‣ Prototype of a function used as base class

var Foo = function() { /* ... */ };

Foo.prototype = { 'bar': function() { /* ... */ }, 'baz': function() { /* ... */ }};

var instance = new Foo();instance.bar();instance.baz();

Page 12: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Prototypal OOP (II)

‣ Function is constructor

‣ “Instances” have an implicit link to the base class

var Foo = function() { /* ... */ };Foo.prototype = { 'bar': function() { /* ... */ }};

var instance = new Foo();instance.bar();

Foo.prototype.baz = function() { /* ... */ };instance.baz();

2. Advanced Language Features

Page 13: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Prototypal OOP (III)

‣ Any objects can be extended/changed at any time

Number.prototype.celsiusToFahrenheit = function() { return (this * 9 / 5) + 32;};

js> (34).celsiusToFahrenheit();93.2js> (0).celsiusToFahrenheit();32

2. Advanced Language Features

Page 14: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Scope‣ JavaScript has a lexical (static) scope

‣ Scope contains everything that is visible when the function is defined

‣ this is the context the function is executed in

‣ Functions can be executed in other contexts

2. Advanced Language Features

Page 15: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Scope (II)

‣ Scope lives on even after the outer function returned

var bar = function() {

}();

2. Advanced Language Features

js> bar();foo

var foo = "foo"; return function() { console.log(foo); };

Page 16: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Scope (III)

var formulas = { 'Celsius': { 'Fahrenheit': 'this * 1.8 + 32', 'Reaumur': 'this * 0.8' }, 'Fahrenheit': { 'Celsius': '(this - 32) / 1.8', 'Reaumur': '(this - 32) / 2.25' }, 'Reaumur': { 'Celsius': 'this * 1.25', 'Fahrenheit': 'this * 2.25 + 32' }};

2. Advanced Language Features

Page 17: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Scope (IV)(function() { var formulas = ...;

})();

2. Advanced Language Features

for (var from in formulas) {

}

for (var to in formulas[from]) {

}

Number.prototype[from + 'To' + to] = (function(formula) {

})(formulas[from][to]);

return function() { return eval(formula); };

Page 18: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Array extensions‣ Provide functional programming style for arrays

[1, 2, 3].forEach(function(i) { print(i);});

2. Advanced Language Features

Page 19: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

JavaScript 1.7function fib() { var i = 0, j = 1; while (true) { yield i; var t = i; i = j; j += t; }}

var g = fib();for (var i = 0; i < 10; i++) { print(g.next());}

2. Advanced Language Features

Page 20: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Contents1. Why JavaScript?

2. Advanced Language Features

3. Patterns and Techniques

4. Debugging and Analyzing

3. Patterns and Techniques

Page 21: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Singletons‣ Regular object.

3. Patterns and Techniques

Page 22: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Inheritancevar foo = function() { };foo.prototype.value = "foo";foo.prototype.bar = function() { print(this.value);};

var baz = function() { };baz.prototype = new foo; // baz inherits from foobaz.prototype.value = "baz";

(new foo).bar(); // prints "foo"(new baz).bar(); // prints "baz"

3. Patterns and Techniques

Page 23: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Inheritance (II)

// ...

foo.prototype.betterBar = function() { print("value: "+ this.value);};

(new baz).betterBar(); // prints "value: baz"

3. Patterns and Techniques

Page 24: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Decorator‣ Creating an instance that is slightly different

‣ JavaScript allows overwriting methods

Function.prototype.decorate = function(pre, post) { var old = this;

return function() {

};};

3. Patterns and Techniques

if (pre) pre.apply(this, arguments); old.apply(this, arguments); if (post) post.apply(this, arguments);

Page 25: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Decorator (II)

var foo = function() { };foo.prototype.bar = function(message) { print(message);};

var baz = new foo();baz.bar = baz.bar.decorate(function() { print("pre");});

baz.bar("message");

3. Patterns and Techniques

Page 26: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Delegates‣ Delegate tasks to another object

‣ One object can use many different delegate objects

var simpleDataSource = { 'length': function() { return storage.length; }, 'item': function(i) { return storage[i]; }};

3. Patterns and Techniques

Page 27: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Delegates (II)

var urlDataSource = function(src) { this.source = src;};

urlDataSource.prototype = {

};

3. Patterns and Techniques

'item': function(i) { return loadData(this.source, { 'command': 'fetch', 'id': i }); }

'length': function() { return loadData(this.source, { 'command': 'length' }); },

Page 28: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Delegates (III)var obj = function(datasource) { this.datasource = datasource;};

obj.prototype.foo = function() {

};

3. Patterns and Techniques

var length = this.datasource.length(); for (var i = 0; i < length; i++) { var item = this.datasource.item(i); // do something with item }

var foo = new obj(simpleDataSource);var bar = new obj(new urlDataSource ("http://example.com"));

Page 29: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Delegates (IV)

‣ Pull vs. Push

Object

Delegate

Synchronous Call

Object

Delegate

Asynchronous Call

(Calls supplied method when the delegated action is finished)

3. Patterns and Techniques

Page 30: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Named parametersvar extend = function(obj, vars) {

};

3. Patterns and Techniques

var foo = function(params) { extend(this, params);};

var bar = new foo({ position: 'left', start: 3 });

for (var i in vars)if (obj[i]) extend(obj[i], vars[i]);else obj[i] = vars[i];

Page 31: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Currying‣ Invented in 1967

‣ Named in honor of Haskell Curry

‣ Also used in languages like Ruby, Haskell, Smalltalk

‣ Pre-configure function parameters

‣ Alter the context when called (the this variable)

3. Patterns and Techniques

Page 32: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Currying (II)Function.prototype.curry = function(scope) {

};

3. Patterns and Techniques

var fn = this, args = [];

for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);

return function() {

};

var params = [].concat(args);

for (var i = 0; i < arguments.length; i++) params.push(arguments[i]);

return fn.apply([ this, scope || window ], params);

Page 33: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Currying (III)

function add(a, b) { return parseInt(a) + parseInt(b);}

var add5 = add.curry(null, 5);add5(10); // Result: 15

3. Patterns and Techniques

Page 34: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Currying (IV)

var foo = function(str, e) { console.assert(this == 'test');};

$('a.test').click(foo.curry('test'));

3. Patterns and Techniques

Page 35: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Memoization‣ Save intermediate results

var fib = function(memo) {

}([0, 1]);

fib(24);fib(8); // no new calculations needed

return function(n) {

};

if (typeof memo[n] !== 'number') memo[n] = fib(n - 1) + fib(n - 2);

return memo[n];

Page 36: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Contents1. Why JavaScript?

2. Advanced Language Features

3. Patterns and Techniques

4. Debugging and Analyzing

4. Debugging and Analyzing

Page 37: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

‣ Advanced JavaScript console

‣ Logging to the console (console.log())

‣ DOM inspector

‣ JavaScript debugger (with backtrace!)

‣ Profile JavaScript activity

‣ http://getfirebug.com

4. Debugging and Analyzing

Page 38: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Firebug Lite‣ Console for other browsers

‣ No profiling

‣ Doesn’t do your laundry

‣ http://getfirebug.com/lite.html

‣ http://drupal.org/project/firebug

4. Debugging and Analyzing

Page 39: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

‣ JavaScript debugger for IE

‣ Free of charge

‣ Some configuration work needed

‣ http://msdn.microsoft.com/vstudio/express/vwd/

Page 40: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

WebDevHelper‣ JavaScript console for IE

‣ HTTP Logger

‣ JavaScript backtracer

‣ http://projects.nikhilk.net/WebDevHelper/Default.aspx

4. Debugging and Analyzing

Page 41: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

JavaScript Lint‣ Lint = tool for analyzing code

‣ Discovers sloppy coding

‣ Command line interface

‣ Use as pre-commit hook for <insert RCS>

‣ http://javascriptlint.com/

‣ TextMate bundle: http://andrewdupont.net/2006/10/01/javascript-tools-textmate-bundle/

4. Debugging and Analyzing

Page 42: Advanced JavaScript · JavaScript vs. browsers ‣ JavaScript originated in Netscape as “LiveScript” ‣ JavaScript is not specific to browsers ‣ Other uses: ‣ Scripting Mozilla’s

Konstantin Käfer

Sources‣ JavaScript: The Good Parts, Douglas Crockford, 2008.

‣ Pro JavaScript Design Patterns, Ross Harmes; Dustin Diaz, 2008.

‣ Pro JavaScript Techniques, John Resig, 2006.

‣ …