SlideShare a Scribd company logo
Intro to Advanced JavaScript




                  By Ryan Stout
About Me
Ryan Stout




agileproductions.com
github.com/ryanstout
Programming
JavaScript for
  14 Years
ExceptionHub
JavaScript
 History
JavaScript
      History
Developed by Brendan Eich in
           1995
JavaScript
      History
Originally called Mocha, then
          LiveScript
JavaScript
     History
Inspired By Scheme and Self
JavaScript
 History
Used C/Java Syntax
JavaScript
      History
Renamed JavaScript to Play off
            Java
JS Fun
not really a number

typeof NaN
//=> number
Topics


http://www.flickr.com/photos/arndalarm/354835622/sizes/l/in/photostream/
Topics
 Concepts
Topics
Frameworks
Topics
Tools/Debugging
Topics
 Testing
Concepts
Types
Primitives
var   myFloat = 5;
var   myFloat2 = 5.0;
var   myString = 'String';
var   myBoolean = true;
var   myNull = null;
var   myUndefined = undefined;
Wrappers
var wFloat = new Number(42.0);
var wString = new String('Hello');
var wBoolean = new Boolean(true);
Container Types
// Wrong Syntax
var myArray = new Array();
var myObject = new Object();

// Correct Syntax
var myArray = [];
var myObject = {};
Dynamic Typing

var pies = 3;

alert("We have " + pies + " pies");
// We have 3 pies
Dynamic Typing
var pies = '5';

// eat 2
pies = pies - 2;

alert('you have '+pies+' pies');
// you have 3 pies
Dynamic Typing
var pies = '5';

// bake 4
pies = pies + 4;

alert('you have '+pies+' pies');
// you have 54 pies
JS Fun
magically changing number
   var a = 9999999999999999
   console.log(a);
   //=> 10000000000000000
Objects
var stateCapitals = {};
stateCapitals['Oregon'] = 'Salem';
stateCapitals['Montana'] = 'Helena';

stateCapitals['Montana']; // Helena
Objects
var stateCapitals = {};
stateCapitals.Oregon = 'Salem';
stateCapitals.Montana = 'Helena';

stateCapitals.Montana; // Helena
Objects
var stateCapitals = {
   'Oregon': 'Salem',
   'Montana': 'Helena'
};

stateCapitals['Montana']; // Helena
stateCapitals.Montana; // Helena
Objects (Hash Buckets)

var states = new Number(50);
states.Oregon = 'Salem';
states.Montana = 'Helena';

states.Montana; // Helena
console.log("We have "+states+" states");
// We have 50 states
Object Iteration
// Object Iteration
for (var state in states) {
  console.log(states[state] + ' is the
  capital of ' + state);
}
// Helena is the capital of Montana
// ...
Object Iteration
// Object Iteration
for (var state in states) {
  if (states.hasOwnProperty(state)) {
    console.log(states[state] + ' is the
    capital of ' + state);
  }
}
// Helena is the capital of Montana
Functions
•First Class
• Lexical Scope
• Prototypal
• Closure
Methods
Methods are just
functions that are
assigned to the property
of an object.
Functions
function concat(stringsArray) {
  return stringsArray.join('');
}

concat(['Cat', 'Fish']); // CatFish
First Class
var concat = function(stringsArray) {
  return stringsArray.join('');
}

concat(['Cat', 'Fish']); // CatFish
Functions
sayHi(); // hi

function sayHi() {
  console.log('hi');
}

sayHi(); // hi
First Class
sayHi(); // ReferenceError: sayHi is
         // not defined

var sayHi = function() {
  console.log('hi');
}

sayHi(); // hi
Lexical Scope
function saySomething() {
  var message = 'Lexical Scoped';
  console.log(message);
}

saySomething(); // Lexical Scoped
console.log(message); //
ReferenceError: message is not
defined
Lexical Scope
function sayDirection(up) {
  if (up == true) {
    var direction = 'up';
  } else {
    var direction = 'down';
  }
  console.log(direction);
}
sayDirection(true); // up
sayDirection(false); // down
Methods
var Singleton = {
   setCount: function(count) {
      this.count = count;
   },
   increment: function() {
      this.count++;
   }
};

Singleton.setCount(5);
Singleton.count; // 5
Singleton.increment();
Singleton.count;// 6
Closures
A "closure" is an expression (typically a
function) that can have free variables
together with an environment that binds
those variables (that "closes" the
expression).
Closures
function makeAdder(aNum) {
  var addNumFunc = function(bNum) {
     return aNum + bNum;
  };

    return addNumFunc;
}

var addFive = makeAdder(5);
console.log(addFive(2)); // 7
console.log(addFive(10)); // 15
$(function() {
  var links = $('a');

  // loop through each link
  links.each(
    function(link, index) {

           // bind the click event
           $(link).click(
              function(event) {
                console.log('clicked link #'+index
                +' of ' + links.length);
              }
           );
       }
  );
});
$(function() {
  var links = $('a');

  // loop through each link
  links.each(
    function(link, index) {

           // bind the click event
           $(link).click(
              function(event) {
                console.log('clicked link #'+index
                +' of ' + links.length);
              }
           );
       }
  );
});
$(function() {
  var links = $('a');

  // loop through each link
  links.each(
    function(link, index) {

           // bind the click event
           $(link).click(
              function(event) {
                console.log('clicked link #'+index
                +' of ' + links.length);
              }
           );
       }
  );
});
$(function() {
  var links = $('a');

  // loop through each link
  links.each(
    function(link, index) {

           // bind the click event
           $(link).click(
              function(event) {
                console.log('clicked link #'+index
                +' of ' + links.length);
              }
           );
       }
  );
});
$(function() {
  var links = $('a');

  // loop through each link
  links.each(
    function(link, index) {

           // bind the click event
           $(link).click(
              function(event) {
                console.log('clicked link #'+index
                +' of ' + links.length);
              }
           );
       }
  );
});
Closures
function addLinks() {
  for (var i=0, link; i<5; i++) {
    link = document.createElement("a");
    link.innerHTML = "Link " + i;
    link.onclick = function () {
       console.log(i);
    };
    document.body.appendChild(link);
  }
}
window.onload = addLinks;
Closures
function addLinks() {
  for (var i=0, link; i<5; i++) {
    link = document.createElement("a");
    link.innerHTML = "Link " + i;
    link.onclick = function (num) {
      return function () {
         alert(num);
      };
    }(i);
    document.body.appendChild(link);
  }
}
Private Variables
var person = function () {
  // Private
  var name = "Ryan";
  return {
     getName : function () {
        return name;
     },
     setName : function (newName) {
        name = newName;
     }
  };
}();
alert(person.name); // Undefined
alert(person.getName()); // "Ryan"
person.setName("Brendan Eich");
alert(person.getName()); // "Brendan Eich"
Prototyping __proto__
var states = {
   'Montana': 'Helena',
   'Oregon': 'Salem'
};

var statesAndOthers = {
  'Guam': 'Hagatna',
  'Puerto Rico': 'San Juan'
}

statesAndOthers['__proto__'] = states;
statesAndOthers['Montana']; // Helena
statesAndOthers['Puerto Rico']; // San Juan
Prototyping __proto_

statesAndOthers        states          Object
 Guam    Hagatna   Montana Helena
 Puerto San Juan    Oregon     Salem
  Rico
__proto__          __proto__
One Problem
var states = {
   'Montana': 'Helena'
   'Oregon': 'Salem'
};

var statesAndOthers = {
  'Guam': 'Hagatna',
  'Puerto Rico': 'San Juan'
}

statesAndOthers['__proto__'] = states;
statesAndOthers['Montana']; // Helena
statesAndOthers['Puerto Rico']; // San Juan
Prototyping
function extendedObject(o) {
  var objFunc = function() {};
  objFunc.prototype = o;
  return new objFunc();
}

var states = {
   'Montana': 'Helena',
   'Oregon': 'Salem'
};

var statesAndOthers = extendedObject(states);
statesAndOthers['Guam'] = 'Hagatna';
statesAndOthers['Puerto Rico'] = 'San Juan';

statesAndOthers['Guam']; // Hagantan
statesAndOthers['Montana']; // Helena
Prototyping
// Constructor
function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
   console.log("Hi, I'm " + this.name);
};

Animal.prototype.isAlive = function() {
   return true;
};

var bob = new Animal('Bob');
bob.speak(); // Hi, I'm Bob
bob.isAlive(); // true
Prototyping
// Constructor
function Animal(name) {
  this.name = name;
}

Animal.prototype = {
  speak: function() {
     console.log("Hi, I'm " + this.name);
  },

     isAlive: function() {
       return true;
     }
};

var bob = new Animal('Bob');
Animal Function Setup

  Animal (func)   Animal.prototype   Object
prototype          Speak      func
                   isAlive    func

                  __proto__
Animal Instance Bob

       bob           Animal.prototype   Object
   name      Bob      Speak      func
__proto__
constructor Animal    isAlive    func

                     __proto__
Prototyping
// Constructor
function Dog(name) {
  this.name = name;
}

Dog.prototype = new Animal();

Dog.prototype.speak = function() {
   console.log("Bark");
};

Dog.prototype.rollOver = function() {
   console.log('rolling over...');
};

var rover = new Dog('Rover');
rover.speak(); // Bark
rover.isAlive(); // true
Dog Class
   Dog (func)        prototype (Dog)
prototype             name      undef
                      Speak      func
                    rollOver     func
                   __proto__

                    Animal.prototype    Object
                     Speak      func
                     isAlive    func

                   __proto__
Rover
       rover              Dog.prototype
   name        Rover   (from new Animal())
                          name     undef
__proto__                 Speak     func
                        rollOver    func
                       __proto__

Animal.prototype
                       Object
 Speak      func
 isAlive       func
__proto__
this
Calling from this
     var EventTracker = {
     count: 0,
     sayCount: function() {
        console.log(this.count, ' times');
     },

     track: function() {
       this.count += 1;
       this.sayCount();
     }
};

EventTracker.track(); // 1 times
EventTracker.track(); // 2 times
More Closure
  var EventTracker = {
   count: 0,
   track: function() {
     var that = this;
     $.get('/track', function(data) {
       that.count += 1;
       console.log(that.count, ' times');
     });
   }
};
Setting this
     var obj1 = {
     name: 'Object 1'
     sayName: function(before, after) {
       console.log(before + this.name + after);
     }
};

var obj2 = {
   name: 'Object 2'
};

obj1.sayName('hi ', '.'); // hi Object1.
obj1.sayName.call(obj2, 'hi', '.'); // hi Object2
obj1.sayName.apply(obj2, ['hi', '.']); // hi Object2
More Closure
     var EventTracker = {
     count: 0,
     callBack: function(data) {
        this.count += 1;
        console.log(this.count, ' times');
     },

     track: function() {
       var that = this;
       $.get('/track', function() { that.callBack() });
     }
};
More Closure
 var EventTracker = {
 count: 0,
 callBack: function(data) {
    this.count += 1;
    console.log(this.count, ' times');
 },

     track: function() {
       var that = this;
       $.get('/track', this.callback.bind(this));
     }
};
Bind Function
    if (!Function.prototype.bind) {
    Function.prototype.bind = function(scope) {
      var func = this;

         return function() {
            return func.apply(scope, arguments);
         };
    };
}
JS Fun
       length of what

console.log((!+[]+[]+![]).length);
//=> 9
Tools


http://www.flickr.com/photos/lenore-m/2515800654/sizes/o/
Compression
Compression
   JSMin
Compression
Yahoo Compressor
Compression
Google Compressor
Debugging
Firebug - Console
Firebug - HTML
Firebug - CSS
Firebug - Script
Firebug - DOM
Firebug - Net
Google Chrome
Safari
Opera Dragonfly
IE - Developer Toolbar
Other IE Tools


Visual Studio
Microsoft Script Editor (Office)
Microsoft Script Debugger (Free)
Testing




http://stopbuyingrotas.wordpress.com/2008/10/
JSpec
 R.I.P.
Jasmine
    The New Hotness

http://pivotal.github.com/jasmine/
Jasmine
Behavior Driven Development
Runs in the Browser
Ruby Gem to Automate Tests
Jasmine
describe("javascript", function() {
  it('should increment a variable', function () {
    var foo = 0;
    foo++;

    expect(foo).toEqual(1);
  });
});
Jasmine
describe("spy behavior", function() {
  it('should spy on an instance method', function() {
    var obj = new Klass();
    spyOn(obj, 'method');
    obj.method('foo argument');

    expect(obj.method).toHaveBeenCalledWith('foo 
    argument');

    var obj2 = new Klass();
    spyOn(obj2, 'method');
    expect(obj2.method).not.toHaveBeenCalled();
  });
});
JS Fun
       bad math

console.log(0.1 + 0.2)
//=> 0.30000000000000004
Frameworks


http://jinja.apsara.org/travels/2005_03_battambang/phnom_sampow.htm
Frameworks
The bad news is JavaScript
is broken, the good news is
we can fix it with JavaScript
               - anonymous
JQuey
• DOM Wrapper
• Event Binding
• Ajax (XMLHttpRequest)
Underscore.js
List comprehension library
Underscore.js
                     Map


_.map([1, 2, 3], function(n){ return n * 2; });
_([1, 2, 3]).map(function(n){ return n * 2; });
// [2, 4, 6]
Underscore.js
                        Each

_.each([1, 2, 3], function(num) { alert(num); });
// alerts each number in turn...
_.each({one : 1, two : 2, three : 3},
   function(num, key){ alert(num); }
);
// alerts each number in turn...
Underscore.js
                      Reject


_.reject([1, 2, 3, 4, 5, 6], function(num) {
    return num % 2 == 0;
});
=> [1, 3, 5]
Underscore.js
• Also
 • include, any, max, min, first, select,
    indexOf, etc...
  • very useful
Reading
One More Thing

            CoffeeScript


http://www.flickr.com/photos/swarmoeskerken/3382771943/sizes/l/
CoffeeScript
# Assignment:              var list, number,
number   = 42              opposite, square;
opposite = true
                           number = 42;
# Conditions:              opposite = true;
number = -42 if opposite   if (opposite) {
                              number = -42;
# Functions:               }
square = (x) -> x * x      square = function(x) {
                              return x * x;
# Arrays:                  };
list = [1, 2, 3, 4, 5]     list = [1, 2, 3, 4, 5];
CoffeeScript
                                 var square;
                                 math = {
# Objects:
                                    root: Math.sqrt,
math =
                                    square: square,
  root:    Math.sqrt
                                    cube: function(x) {
  square: square
                                      return x * square(x);
  cube:    (x) -> x * square x
                                    }
                                 };
# Splats:
race = (winner, runners...) ->
  print winner, runners
                                  Coffee
# Existence:
alert "I knew it!" if elvis?
                                  Script
race = function() {
   var runners, winner;
   winner = arguments[0], runners = 2 <=
arguments.length ? __slice.call(arguments, 1) : [];
   return print(winner, runners);
};
if (typeof elvis != "undefined" && elvis !== null) {
   alert("I knew it!");
}
CoffeeScript
      # Array comprehensions:
      cubes = (math.cube num for num in list)




cubes = (function() {
  _results = [];
  for (_i = 0, _len = list.length; _i < _len; _i++) {
    num = list[_i];
    _results.push(math.cube(num));
  }
  return _results;
}());
JS Fun
    confused >

3 > 2 > 1 // false
Questions

agileproductions.com
ryan@agileproductions.com
References
http://www.slideshare.net/danwrong/
metaprogramming-javascript
http://robertnyman.com/2008/10/09/explaining-
javascript-scope-and-closures/
http://www.bennadel.com/blog/1482-A-
Graphical-Explanation-Of-Javascript-Closures-
In-A-jQuery-Context.htm
Ad

More Related Content

What's hot (20)

Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Kacper Gunia
 
Beyond the DOM: Sane Structure for JS Apps
Beyond the DOM: Sane Structure for JS AppsBeyond the DOM: Sane Structure for JS Apps
Beyond the DOM: Sane Structure for JS Apps
Rebecca Murphey
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
Hugo Hamon
 
The Origin of Lithium
The Origin of LithiumThe Origin of Lithium
The Origin of Lithium
Nate Abele
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
Konstantin Kudryashov
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
Leonardo Proietti
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
Leonardo Proietti
 
News of the Symfony2 World
News of the Symfony2 WorldNews of the Symfony2 World
News of the Symfony2 World
Fabien Potencier
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
Bastian Feder
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretsinternational PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
smueller_sandsmedia
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful software
Jorn Oomen
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
Rafael Dohms
 
Xlab #1: Advantages of functional programming in Java 8
Xlab #1: Advantages of functional programming in Java 8Xlab #1: Advantages of functional programming in Java 8
Xlab #1: Advantages of functional programming in Java 8
XSolve
 
The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016
Kacper Gunia
 
Jquery Fundamentals
Jquery FundamentalsJquery Fundamentals
Jquery Fundamentals
Rebecca Murphey
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolve
XSolve
 
Dollar symbol
Dollar symbolDollar symbol
Dollar symbol
Aaron Huang
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
Hugo Hamon
 
Dependency Injection IPC 201
Dependency Injection IPC 201Dependency Injection IPC 201
Dependency Injection IPC 201
Fabien Potencier
 
Introduction to CQRS and Event Sourcing
Introduction to CQRS and Event SourcingIntroduction to CQRS and Event Sourcing
Introduction to CQRS and Event Sourcing
Samuel ROZE
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Kacper Gunia
 
Beyond the DOM: Sane Structure for JS Apps
Beyond the DOM: Sane Structure for JS AppsBeyond the DOM: Sane Structure for JS Apps
Beyond the DOM: Sane Structure for JS Apps
Rebecca Murphey
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
Hugo Hamon
 
The Origin of Lithium
The Origin of LithiumThe Origin of Lithium
The Origin of Lithium
Nate Abele
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
Konstantin Kudryashov
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
Leonardo Proietti
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
Leonardo Proietti
 
News of the Symfony2 World
News of the Symfony2 WorldNews of the Symfony2 World
News of the Symfony2 World
Fabien Potencier
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
Bastian Feder
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretsinternational PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
smueller_sandsmedia
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful software
Jorn Oomen
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
Rafael Dohms
 
Xlab #1: Advantages of functional programming in Java 8
Xlab #1: Advantages of functional programming in Java 8Xlab #1: Advantages of functional programming in Java 8
Xlab #1: Advantages of functional programming in Java 8
XSolve
 
The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016
Kacper Gunia
 
PHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolvePHPCon 2016: PHP7 by Witek Adamus / XSolve
PHPCon 2016: PHP7 by Witek Adamus / XSolve
XSolve
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
Hugo Hamon
 
Dependency Injection IPC 201
Dependency Injection IPC 201Dependency Injection IPC 201
Dependency Injection IPC 201
Fabien Potencier
 
Introduction to CQRS and Event Sourcing
Introduction to CQRS and Event SourcingIntroduction to CQRS and Event Sourcing
Introduction to CQRS and Event Sourcing
Samuel ROZE
 

Viewers also liked (14)

General Assembly Workshop: Advanced JavaScript
General Assembly Workshop: Advanced JavaScriptGeneral Assembly Workshop: Advanced JavaScript
General Assembly Workshop: Advanced JavaScript
Spike Brehm
 
JavaScript Advanced Skill
JavaScript Advanced SkillJavaScript Advanced Skill
JavaScript Advanced Skill
firestoke
 
JavaScript: Advanced Scoping & Other Puzzles
JavaScript: Advanced Scoping & Other PuzzlesJavaScript: Advanced Scoping & Other Puzzles
JavaScript: Advanced Scoping & Other Puzzles
Sencha
 
Advanced JavaScript Concepts
Advanced JavaScript ConceptsAdvanced JavaScript Concepts
Advanced JavaScript Concepts
Naresh Kumar
 
Advanced Object-Oriented JavaScript
Advanced Object-Oriented JavaScriptAdvanced Object-Oriented JavaScript
Advanced Object-Oriented JavaScript
ecker
 
Advanced JavaScript Techniques
Advanced JavaScript TechniquesAdvanced JavaScript Techniques
Advanced JavaScript Techniques
Dmitry Baranovskiy
 
Advanced Javascript
Advanced JavascriptAdvanced Javascript
Advanced Javascript
Adieu
 
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web AppsMashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Bastian Hofmann
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
Mahmoud Tolba
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
Nascenia IT
 
Modern JavaScript Applications: Design Patterns
Modern JavaScript Applications: Design PatternsModern JavaScript Applications: Design Patterns
Modern JavaScript Applications: Design Patterns
Volodymyr Voytyshyn
 
5 Tips for Better JavaScript
5 Tips for Better JavaScript5 Tips for Better JavaScript
5 Tips for Better JavaScript
Todd Anglin
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
Stoyan Stefanov
 
Beginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptBeginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScript
Stoyan Stefanov
 
General Assembly Workshop: Advanced JavaScript
General Assembly Workshop: Advanced JavaScriptGeneral Assembly Workshop: Advanced JavaScript
General Assembly Workshop: Advanced JavaScript
Spike Brehm
 
JavaScript Advanced Skill
JavaScript Advanced SkillJavaScript Advanced Skill
JavaScript Advanced Skill
firestoke
 
JavaScript: Advanced Scoping & Other Puzzles
JavaScript: Advanced Scoping & Other PuzzlesJavaScript: Advanced Scoping & Other Puzzles
JavaScript: Advanced Scoping & Other Puzzles
Sencha
 
Advanced JavaScript Concepts
Advanced JavaScript ConceptsAdvanced JavaScript Concepts
Advanced JavaScript Concepts
Naresh Kumar
 
Advanced Object-Oriented JavaScript
Advanced Object-Oriented JavaScriptAdvanced Object-Oriented JavaScript
Advanced Object-Oriented JavaScript
ecker
 
Advanced JavaScript Techniques
Advanced JavaScript TechniquesAdvanced JavaScript Techniques
Advanced JavaScript Techniques
Dmitry Baranovskiy
 
Advanced Javascript
Advanced JavascriptAdvanced Javascript
Advanced Javascript
Adieu
 
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web AppsMashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Bastian Hofmann
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
Nascenia IT
 
Modern JavaScript Applications: Design Patterns
Modern JavaScript Applications: Design PatternsModern JavaScript Applications: Design Patterns
Modern JavaScript Applications: Design Patterns
Volodymyr Voytyshyn
 
5 Tips for Better JavaScript
5 Tips for Better JavaScript5 Tips for Better JavaScript
5 Tips for Better JavaScript
Todd Anglin
 
Beginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptBeginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScript
Stoyan Stefanov
 
Ad

Similar to Intro to Advanced JavaScript (20)

JavaScript - Like a Box of Chocolates
JavaScript - Like a Box of ChocolatesJavaScript - Like a Box of Chocolates
JavaScript - Like a Box of Chocolates
Robert Nyman
 
Object-oriented Javascript
Object-oriented JavascriptObject-oriented Javascript
Object-oriented Javascript
Daniel Ku
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
Seri Moth
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
Stoyan Stefanov
 
JavaScript - Like a Box of Chocolates - jsDay
JavaScript - Like a Box of Chocolates - jsDayJavaScript - Like a Box of Chocolates - jsDay
JavaScript - Like a Box of Chocolates - jsDay
Robert Nyman
 
Web Optimization Summit: Coding for Performance
Web Optimization Summit: Coding for PerformanceWeb Optimization Summit: Coding for Performance
Web Optimization Summit: Coding for Performance
johndaviddalton
 
Introduction to ECMAScript 2015
Introduction to ECMAScript 2015Introduction to ECMAScript 2015
Introduction to ECMAScript 2015
Tomasz Dziuda
 
JavaScript patterns
JavaScript patternsJavaScript patterns
JavaScript patterns
Norihito YAMAKAWA
 
JavaScript and HTML5 - Brave New World (revised)
JavaScript and HTML5 - Brave New World (revised)JavaScript and HTML5 - Brave New World (revised)
JavaScript and HTML5 - Brave New World (revised)
Robert Nyman
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5a
rajivmordani
 
HTML5 APIs - Where no man has gone before! - Altran
HTML5 APIs - Where no man has gone before! - AltranHTML5 APIs - Where no man has gone before! - Altran
HTML5 APIs - Where no man has gone before! - Altran
Robert Nyman
 
The Beauty of Java Script
The Beauty of Java ScriptThe Beauty of Java Script
The Beauty of Java Script
Michael Girouard
 
jQuery Data Manipulate API - A source code dissecting journey
jQuery Data Manipulate API - A source code dissecting journeyjQuery Data Manipulate API - A source code dissecting journey
jQuery Data Manipulate API - A source code dissecting journey
Huiyi Yan
 
Say It With Javascript
Say It With JavascriptSay It With Javascript
Say It With Javascript
Giovanni Scerra ☃
 
JavaScript & HTML5 - Brave New World
JavaScript & HTML5 - Brave New WorldJavaScript & HTML5 - Brave New World
JavaScript & HTML5 - Brave New World
Robert Nyman
 
Everyday's JS
Everyday's JSEveryday's JS
Everyday's JS
Adib Mehedi
 
Ian 20150116 java script oop
Ian 20150116 java script oopIan 20150116 java script oop
Ian 20150116 java script oop
LearningTech
 
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
Guilherme Carreiro
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Domenic Denicola
 
JavaScript APIs - The Web is the Platform - .toster conference, Moscow
JavaScript APIs - The Web is the Platform - .toster conference, MoscowJavaScript APIs - The Web is the Platform - .toster conference, Moscow
JavaScript APIs - The Web is the Platform - .toster conference, Moscow
Robert Nyman
 
JavaScript - Like a Box of Chocolates
JavaScript - Like a Box of ChocolatesJavaScript - Like a Box of Chocolates
JavaScript - Like a Box of Chocolates
Robert Nyman
 
Object-oriented Javascript
Object-oriented JavascriptObject-oriented Javascript
Object-oriented Javascript
Daniel Ku
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
Seri Moth
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
Stoyan Stefanov
 
JavaScript - Like a Box of Chocolates - jsDay
JavaScript - Like a Box of Chocolates - jsDayJavaScript - Like a Box of Chocolates - jsDay
JavaScript - Like a Box of Chocolates - jsDay
Robert Nyman
 
Web Optimization Summit: Coding for Performance
Web Optimization Summit: Coding for PerformanceWeb Optimization Summit: Coding for Performance
Web Optimization Summit: Coding for Performance
johndaviddalton
 
Introduction to ECMAScript 2015
Introduction to ECMAScript 2015Introduction to ECMAScript 2015
Introduction to ECMAScript 2015
Tomasz Dziuda
 
JavaScript and HTML5 - Brave New World (revised)
JavaScript and HTML5 - Brave New World (revised)JavaScript and HTML5 - Brave New World (revised)
JavaScript and HTML5 - Brave New World (revised)
Robert Nyman
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5a
rajivmordani
 
HTML5 APIs - Where no man has gone before! - Altran
HTML5 APIs - Where no man has gone before! - AltranHTML5 APIs - Where no man has gone before! - Altran
HTML5 APIs - Where no man has gone before! - Altran
Robert Nyman
 
jQuery Data Manipulate API - A source code dissecting journey
jQuery Data Manipulate API - A source code dissecting journeyjQuery Data Manipulate API - A source code dissecting journey
jQuery Data Manipulate API - A source code dissecting journey
Huiyi Yan
 
JavaScript & HTML5 - Brave New World
JavaScript & HTML5 - Brave New WorldJavaScript & HTML5 - Brave New World
JavaScript & HTML5 - Brave New World
Robert Nyman
 
Ian 20150116 java script oop
Ian 20150116 java script oopIan 20150116 java script oop
Ian 20150116 java script oop
LearningTech
 
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
TDC 2014 - JavaScript de qualidade: hoje, amanhã e sempre!
Guilherme Carreiro
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Domenic Denicola
 
JavaScript APIs - The Web is the Platform - .toster conference, Moscow
JavaScript APIs - The Web is the Platform - .toster conference, MoscowJavaScript APIs - The Web is the Platform - .toster conference, Moscow
JavaScript APIs - The Web is the Platform - .toster conference, Moscow
Robert Nyman
 
Ad

More from ryanstout (8)

Neural networks - BigSkyDevCon
Neural networks - BigSkyDevConNeural networks - BigSkyDevCon
Neural networks - BigSkyDevCon
ryanstout
 
Volt 2015
Volt 2015Volt 2015
Volt 2015
ryanstout
 
Isomorphic App Development with Ruby and Volt - Rubyconf2014
Isomorphic App Development with Ruby and Volt - Rubyconf2014Isomorphic App Development with Ruby and Volt - Rubyconf2014
Isomorphic App Development with Ruby and Volt - Rubyconf2014
ryanstout
 
Reactive programming
Reactive programmingReactive programming
Reactive programming
ryanstout
 
Concurrency Patterns
Concurrency PatternsConcurrency Patterns
Concurrency Patterns
ryanstout
 
EmberJS
EmberJSEmberJS
EmberJS
ryanstout
 
Practical Machine Learning and Rails Part2
Practical Machine Learning and Rails Part2Practical Machine Learning and Rails Part2
Practical Machine Learning and Rails Part2
ryanstout
 
Practical Machine Learning and Rails Part1
Practical Machine Learning and Rails Part1Practical Machine Learning and Rails Part1
Practical Machine Learning and Rails Part1
ryanstout
 
Neural networks - BigSkyDevCon
Neural networks - BigSkyDevConNeural networks - BigSkyDevCon
Neural networks - BigSkyDevCon
ryanstout
 
Isomorphic App Development with Ruby and Volt - Rubyconf2014
Isomorphic App Development with Ruby and Volt - Rubyconf2014Isomorphic App Development with Ruby and Volt - Rubyconf2014
Isomorphic App Development with Ruby and Volt - Rubyconf2014
ryanstout
 
Reactive programming
Reactive programmingReactive programming
Reactive programming
ryanstout
 
Concurrency Patterns
Concurrency PatternsConcurrency Patterns
Concurrency Patterns
ryanstout
 
Practical Machine Learning and Rails Part2
Practical Machine Learning and Rails Part2Practical Machine Learning and Rails Part2
Practical Machine Learning and Rails Part2
ryanstout
 
Practical Machine Learning and Rails Part1
Practical Machine Learning and Rails Part1Practical Machine Learning and Rails Part1
Practical Machine Learning and Rails Part1
ryanstout
 

Recently uploaded (20)

Build Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For DevsBuild Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For Devs
Brian McKeiver
 
Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.
hpbmnnxrvb
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
Build 3D Animated Safety Induction - Tech EHS
Build 3D Animated Safety Induction - Tech EHSBuild 3D Animated Safety Induction - Tech EHS
Build 3D Animated Safety Induction - Tech EHS
TECH EHS Solution
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
Semantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AISemantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AI
artmondano
 
Vaibhav Gupta BAML: AI work flows without Hallucinations
Vaibhav Gupta BAML: AI work flows without HallucinationsVaibhav Gupta BAML: AI work flows without Hallucinations
Vaibhav Gupta BAML: AI work flows without Hallucinations
john409870
 
Are Cloud PBX Providers in India Reliable for Small Businesses (1).pdf
Are Cloud PBX Providers in India Reliable for Small Businesses (1).pdfAre Cloud PBX Providers in India Reliable for Small Businesses (1).pdf
Are Cloud PBX Providers in India Reliable for Small Businesses (1).pdf
Telecoms Supermarket
 
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-UmgebungenHCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
panagenda
 
Cyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of securityCyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of security
riccardosl1
 
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
Alan Dix
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
Top 10 IT Help Desk Outsourcing Services
Top 10 IT Help Desk Outsourcing ServicesTop 10 IT Help Desk Outsourcing Services
Top 10 IT Help Desk Outsourcing Services
Infrassist Technologies Pvt. Ltd.
 
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptxIncreasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Anoop Ashok
 
Quantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur MorganQuantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur Morgan
Arthur Morgan
 
HCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser EnvironmentsHCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser Environments
panagenda
 
Technology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data AnalyticsTechnology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data Analytics
InData Labs
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
Build Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For DevsBuild Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For Devs
Brian McKeiver
 
Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.
hpbmnnxrvb
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
Build 3D Animated Safety Induction - Tech EHS
Build 3D Animated Safety Induction - Tech EHSBuild 3D Animated Safety Induction - Tech EHS
Build 3D Animated Safety Induction - Tech EHS
TECH EHS Solution
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
Semantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AISemantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AI
artmondano
 
Vaibhav Gupta BAML: AI work flows without Hallucinations
Vaibhav Gupta BAML: AI work flows without HallucinationsVaibhav Gupta BAML: AI work flows without Hallucinations
Vaibhav Gupta BAML: AI work flows without Hallucinations
john409870
 
Are Cloud PBX Providers in India Reliable for Small Businesses (1).pdf
Are Cloud PBX Providers in India Reliable for Small Businesses (1).pdfAre Cloud PBX Providers in India Reliable for Small Businesses (1).pdf
Are Cloud PBX Providers in India Reliable for Small Businesses (1).pdf
Telecoms Supermarket
 
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-UmgebungenHCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
panagenda
 
Cyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of securityCyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of security
riccardosl1
 
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
Alan Dix
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptxIncreasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Anoop Ashok
 
Quantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur MorganQuantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur Morgan
Arthur Morgan
 
HCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser EnvironmentsHCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser Environments
panagenda
 
Technology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data AnalyticsTechnology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data Analytics
InData Labs
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 

Intro to Advanced JavaScript