Using Vars to Shortcut Namespaces
When I was researching the last turing.js framework article I came across a simple technique for namespace shortcuts in TJ Holowaychuk’s jspec. I haven’t noticed it used very often, so I thought DailyJS hackers may find it interesting.
;(function() {
MyClass = {
map: function(object, callback) {
var items = [];
each(object, function(i) { items.push(callback.apply(this, arguments)); });
return items;
},
each: function(object, callback) {
for (var i = 0; i < object.length; i++) {
callback(i);
}
}
}
var methods = 'each map'.split(/ /);
while (methods.length) { eval('var ' + methods[0] + ' = MyClass.' + methods.shift()); }
})();
// Map can refer to each without dereferencing
result = MyClass.map([1, 2, 3], function(i) {
return i + 1;
});
print(result);
// 1,2,3
Ignore the implementations of each and map and look at the loop after MyClass.
What happens here is a list of methods are mapped to vars so they can be referenced without their containing object name.
- MyClass is declared globally
- Methods within the containing anonymous function can refer to hand-picked “utility” methods without referring to MyClass
- These methods are declared as local variables using
eval - The
whileloop iterates over each method name
Notice that the loop refers to each method using methods[0], then methods.shift() when it’s no longer needed, which keeps the loop control simple.
This is useful if you want to cut down code inside a library. It’s safe because the shortcuts are bound to the anonymous function, but novices may find navigating the code difficult. Tracking down where each comes from in a big project might be difficult, so avoid this technique if you’re working on a large project with colleagues with mixed skills.
This is flexible way of achieving similar results to with:
