2. Multi line strings

3. Recursion in anonymous functions

JavaScript allows functions to be created that have no names. These
are called anonymous functions. A recursive function is one that calls
itself, but how does a function call itself if it has no name?
First let’s consider a small program that applies a factorial function to numbers in an array.

4. Short cuts with ‘or’ and ‘and’ operators

When you or together several variables in a statement, JavaScript will return first ‘truthy’ value it finds (see previous post about truthy values). This is useful when you want to use a default value if an existing variable is undefined.

5. A note about ‘undefined’

It turns out that undefined is not a JavaScript keyword, instead undefined is a global variable, which in browsers is defined as window.undefined.
It is not uncommon to see code that tests if a variable is undefined like this:

if(someObject.x=== undefined){// do something}

Which is the same as writing

if(someObject.x=== window.undefined){// do something}

If by some chance your window.undefined variable is modified then
checks for undefined like this will fail. No conscientious developer
would ever do this intentionally, but it may happen by accident causing
hard to find bugs, like this:

var o ={};
window[o.name]='unknown';// BLAM!, window.undefined is now a string

A better way to test for undefined is to use the typeof operator. Typeof an undefined variable will always return the string ‘undefined’.

// Good way to test for undefinedif(typeof someObject.x==='undefined'){// do something}

6. Return statement

The return statement needs it’s value to be on the same line as the
return keyword. This may cause problem depending on your coding style.
For example

// This is okreturn x;// This returns undefinedreturn
x;// This is okreturn{
result:'success'}// This returns undefinedreturn{
result:'success'}

9. Object property names can be any string

10. The ‘debugger’ statement

In the past we were limited to using alert() statements to debug our JavaScript. After that we were rescued with the much more sane console.log(). Things have come a long way and we now have solid line debugging available in modern browsers.
However, there is one addition to our debugging arsenal which I’ve
found particularly invaluable when debugging JavaScript in Internet
Explorer; the debugger statement.
When you add the debugger statement to your code the
browser will stop execution and open the debugging environment ready
for you to continue stepping through your code.
This is moderately useful on Chrome, Firefox and Safari but I have found essential for debugging IE.
Note that within IE, this statement only works in IE7 and above and you need to first start the debug mode.
OK, so that’s 10 features, but just one more thing to wrap up which is not really a JavaScript feature.

JavaScript Coding Coventions

If you’re not following a JavaScript coding convention then here are a couple to get you started:

There has been a quite a bit of chatter recently on whether or not you should use semicolons in your JavaScript code.

JavaScript provides a feature called Automatic Semicolon Insertion
(ASI). For the most part there are rarely problems in omitting
semicolons, but there are a few cases where semicolons are required to
prevent syntax errors or resolve code ambiguities.

A site that triggered a lot of chatter was aresemicolonsnecessaryinjavascript.com which boldly states ‘NO’. The author is really trying to explain
we should not just include semicolons everywhere due a fear that our
code might break in some environments or parsers (such as JavaScript
minifiers). Others are also continuing the same point that we should
better understand why semicolons in JavaScript are optional.

Are Semicolons Necessary in Javascript? Despite popular belief the
answer is "sometimes" and not "no". But to save yourself time and
troubles, just place them all the time. Not only will it save yourself
some headaches, your code will also look more consistent. Because there
will be situations where a semicolon becomes necessary to resolve
ambiguities.

So what will I be doing? My vote goes to following Douglas Crockford’s JavaScript coding guidelines for now and I’ll be happily including semicolons in my code.

In the past it was very common to see global variables in snippets of JavaScript code across the web, such as:

name="Spock";function greeting(){return"Hello "+name;}

A better approach is to place all of your code within a namespace; an object that contains all of your code and helps to prevent name clashes with JavaScript code written by others.
The simplest method of creating a namespace is to use an object literal.

Here, when the function is executed it creates a private variable and
a private inner function. The inner function can refer to the private
variable directly. The main function then returns an object literal
containing a reference to the greeting private function – this then
exposes the greeting function as a public function so we can call it via
the foo namespace.

In the Decoding jQuery series,
we will break down every single method in jQuery, to study the beauty
of the framework, as an appreciation to the collective/creative geniuses
behind it.

Inside manipulation.js within the jQuery source, there is an interesting internal method named

domManip, this is mainly used for methods like: .append(), .prepend(), .before() and .after().

domManip:function( args, table, callback ){//...}

Using fragment
In domManip, jQuery first checks if we are dealing with fragment node. In DOM, there are 12 different node types, and the one jQuery is checking is type 11 (Node.DOCUMENT_FRAGMENT_NODE == 11).
If we’re in a fragment, just use it, otherwise, building a new one using jQuery.buildFragment.

3. To check if an element is cacheable. The method only caches
“small” (1/2 KB) HTML strings that are associated with the main
document. Cloning options loses the selected state, so it doesn’t cache
them. IE 6 doesn’t like it when you put object or embed
elements in a fragment. Also, WebKit does not clone ‘checked’
attributes on cloneNode, so it doesn’t cache them either. Lastly, IE6,
7, 8 will not correctly reuse cached fragments that were created from
unknown elements.

Appending script
I first discovered this while inserting a script tag using jQuery and inspect the element without seeing this. This is because within the domManip, there is a check for script elements.

This check does 4 things here:
1. first it detects and loop through all the script elements
2. if the script element has a src attribute, then jQuery uses jQuery ajax to load the script
3. if the script is embedded, jQuery uses jQuery.globalEval to evaluate the script
4. it removed the child from the parent element

In the Decoding jQuery series,
we will break down every single method in jQuery, to study the beauty
of the framework, as an appreciation to the collective/creative geniuses
behind it.

The jQuery.Callbacks() function, introduced in version 1.7, returns a
multi-purpose object that provides a powerful way to manage callback
lists. It supports adding, removing, firing, and disabling callbacks. (jQuery API Doc)
It provides many Supported Flags.
It is structured as a list of space-separated strings that change how
the callback list behaves (eg. $.Callbacks( ‘unique stopOnFalse’ )).
Callbacks Object can also be used to do pub/sub and it is also used to make jQuery.Deferred().1. Structure of jQuery.Callbacks()
Below is how the structure of jQuery.Callbacks() function looks like in jQuery source(callbacks.js).

add function – adds a list of callbacks to the variable list array.fire function – loops through the items in the list and fire them one by one.self object – is the actual Callbacks object returned at the end of the function.
The most important methods in the self object are:add() adds a callback or a collection of callbacks to the list, this is the one we use to build subscribe in pub/sub functionfireWith() method actually calls all callbacks with the given context and argumentsfire() method inside the self object executes fireWith with the object as the context, this is the one we use to build publish in pub/sub function
There are also many other essential and useful methods in the self object, they are:has(): a boolean check to find out if a callback list contains a specific callbackremove(): Remove a callback from the listempty(): a method for emptiying a callback list of all callbacks added so fardisable(): disables further calls being made to the callback listlock(): lock the list in its current state

2. How to use Callbacks object
Suppose we have a Rails application, assume we have a function displayAlert and msgStatus like the ones below.

After creating a callbacks = $.Callbacks();, we can use add to add displayAlert to the callbacks variable as a list item, and later add postFeed as a new item. By using fire, the callbacks object is fired with the function/functions executed.
As explained above, fire is actually fireWith with the object itself as the context, you can also define/specify a context and arguments for callbacks being bound and fired.

In the above example, the publish and subscribe use fire and add for the pub/sub pattern, and remove for unsubscribe.
This is not the only way to use jQuery for pub/sub, Addy’s Four Ways To Do Pub/Sub With jQuery 1.7 and jQuery UI gist discussed more ways of doing it with jQuery and jQuery UI.

The Alienware x51 series is a standalone PC tower which you would
attach to your own TV and peripherals and starts at $599 (ranging up to
$1049, with “build yours” options).

Ubuntu on Alienware

Regarding Ubuntu, Alienware describes it’s “simple and stylish”
nature, and highlights that it’s “fast and secure” and offers “free
applications and storage”, not to mention explaining (to newcomers,
presumably) the plethora of Ubuntu default applications.
Alienware also plugs Steam for Linux as the gaming platform on this
PC, noting the rapidly expanding Linux game library that Steam provides.

Video Hardware

Arguably the most important element for gaming is the graphics card
and the X51 systems offer NVIDIA hardware. Of course, under Ubuntu you
would have NVIDIA’s supported drivers out-of-the-box, so you would be
able to game right away. Having said that, it probably would be ideal to
keep tabs on updates for the drivers regularly.

More info

You can check out the Alienware website for more info on the x51
series, such as the range of hardware specifications and availability.

Early in March, Intel –specifically the Intel Open Source Technology
Centre– released a graphical installer providing Linux users with a
friendly way for downloading the latest Intel-related open source Linux
graphics components –for the more technical this includes:

Getting the Latest and Greatest Intel Linux Drivers

Intel Linux Graphics Installer automatically detects your hardware
and system specifics and adds a software repository to your sources for
keeping you up-to-date. The installer also performs a check to see if
your system is running the latest drivers and, if not, it runs a system
upgrade.

However, the installer doesn’t automatically add the repository
authentication key to your system but it can manually added by opening a
terminal, and executing:

Music streaming service, and major Spotify rival, Rdio recently upped its ‘free’ offerings for international users.
For the cost of an e-mail address users in a multitude of countries,
including the UK, Germany and France, can now get 6 months of free
on-demand access to Rdio’s library of music.
With over 18 million tracks on offer – albeit 3 million less than Spotify – most major artists, labels and songs are available.

Alongside the 6 month ‘trial period’ free users are also subject to a
monthly playback limit. There’s no set-rate for how many songs this is
but there is a green ‘tracks remaining’ meter at the top of the Rdio
page to let you know how much free music you have remaining for the
present month.

Track Remaining Meter on Rdio

For contrast, Spotify offers six months of unlimited but ad-supported playback for free. After this free users are subject to a 2.5 hour listening limit per week thereafter.
Rdio’s hope is, of course, that by offering a relatively lengthy free
trial with few limits, users will be such fans of the service they’ll
be chomping at the bit to sign up to one of the two premium accounts on
offer when their free trial ends.
With Rdio, $4.99/£4.99 per month gets you unlimited web/desktop app
playback, while £9.99/$9.99 a month extends this access to smart-phones,
tablets and media devices.

Availability

Rdio is currently available to users in the USA, New Zealand,
Australia and much of western Europe, including Germany, France, Sweden
and the UK.
A roll-out to Japan on the cards for later this month.

Accessing Rdio on Ubuntu

So that’s what Rdio offers for free and where it offers it – but how well supported is it in Ubuntu?
Like Spotify, Rdio provides desktop applications for various
platforms but, unlike Spotify, this doesn’t include Linux. Worse still,
Rdio say that “wider Linux desktop support isn’t currently on the roadmap.”

The good news is that Rdio‘s primary playback spot is via
its gorgeous web player. This can be accessed from any web-browser that
supports Flash, and on any platform. Just log-in and away you go.

Unity Web App

A Unity Web App is Already Available

Further still, Rdio is one of the few third-party websites to support
Unity’s (much maligned) Web Apps feature. Visit the web-site in Firefox
or Chromium and you’ll be prompted to enable integration.

Whilst this approach integrates the web plater with Ubuntu’s Sound
Menu it doesn’t support track change notifications, quick-list controls,
or media key support.
In fact, here at least, it also lacks an icon…

The good news is that, thanks to a third party developer, we can now go one better on Ubuntu…

New Rdio Desktop App for Ubuntu

‘Rdio‘ by developer Scott Ringwelski is an unofficial Rdio app for Ubuntu.
It runs the Rdio website interface in a dedicated windowed ‘wrapper’
on the desktop, hooking into the Ubuntu Sound Menu, notification system
and Unity Quicklists.

Rdio Desktop App for Ubuntu – Unity Support Baked In

These minor additions turn what is, essentially, a ‘web-app’ into
something that feels more native than running the Rdio site in a browser
tab.

Simple things, like being able to hit the ‘Next’ or ‘Pause’ keys to control playback really aid this.
If you’ve been looking for a reason to give Rdio a go – now seems the perfect time.

Features

Ubuntu Sound Menu Integration

Ubuntu Notification System Support

Unity Launcher Quicklist

Media Key Support

Drawbacks

Clicking ‘x’ will exit the app

Adobe Flash is required for playback

Doesn’t support music download

Download Rdio for Ubuntu

Installing Rdio in Ubuntu 12.04, 12.10 & 12.10 is as easy as adding the following PPA:

Following on from its release last week, GNOME’s default web-browser is now available for users of Ubuntu 13.04 to install.
The aptly-titled Web, is a lightweight webkit browser built using
GNOME technologies and designed specifically for the GNOME desktop.
Ubuntu GNOME 13.04 users can install the release from the GNOME PPAs,
both of which also upgrade the stock GNOME 3.6 desktop to GNOME 3.8.

Why Web?

Despite being the default web-browser in GNOME few GNOME-using
distributions actually ship with it by default. Ubuntu GNOME, Fedora and
OpenSuSE instead provide Firefox to their users. That’s understandable:
Firefox is a power-house of a name.
But just because Web is a less well known doesn’t mean that it’s less
useful. In fact, it’s rather charming. The minimal gives less room to
excessive options and more room to web-pages, and if you can live
without add-ons, themes and extensions, you’ll find it can do just about
anything other browsers can.
And that list of ‘can do’s’ grows a little longer in this latest release…

New in Web 3.8

But what’s new in Web 3.8 specifically? Quite a fair bit.
A private browsing mode has been added, letting you tip-toe around the web without leaving a trace.
To go ‘Incognito’ just click the Web app menu and select ‘New Incognito Window’.

Private Browsing in Web 3.8

Another user-experience tweak – and one many will be incredibly pleased to see arrive – is the arrival of a ‘New Tab’ button in the application toolbar. I sorely missed having this accessible in previous versions.

Adobe’s Flash plugin is now supported natively. Just install the Adobe Flash Plugin installer package from the Ubuntu Software Center and Web will do the rest.
Other changes in addition to those mentioned above:

‘Page Search’ style now matches other GNOME apps

Improved HTML5 media controls

‘Undo Closed Tab’ action added to App Menu

Install Web 3.8 in Ubuntu GNOME 13.04

In stock, freshly installed Ubuntu GNOME you can install the previous
version of Web, version 3.6, straight from the Ubuntu Software Center.

But for this newer, more featured and more stable release you’ll need
to add the following GNOME Team PPA. It’s important that you’re aware
that adding this will also upgrade the rest of your desktop to GNOME
3.8.

First add the GNOME Team PPA using the Terminal:

sudo add-apt-repository ppa:gnome3-team/gnome3; sudo apt-get update

Now hit the button below to install Web 3.8 through the Ubuntu Software Center