第四章 Wielding functions
4.1 Anonymous functions
下面的代码演示了采用匿名函数的几个典型场景
/**
* Establish an anonymous function as event handler. There's no
* need to create a named function only to reference it in
* this location
*/
window.onload = function() {};
/**
* Creates a function to be used as a method for ninja. We'll
* be using the property named shot to invoke the function, so
* it doesn't need its own name
*/
var ninja = {
shout: function() {
}
};
/**
* Passes a function to the setTimeout() function as a callback
* to be invoked when the timer expires. Again, why bother to
* give it an unneeded name?
*/
setTimeout(function() {});
4.2 Recursion
4.2.1 Recursion in named functions
/**
* Declares a recursive chirping function that calls itself by name
* until it determines that it's done.
*/
function chirp(n) {
return n > 1 ? chirp(n-1) + "-chirp" : "chirp";
}
chirp(3);
4.2.2 Recursion with methods
/**
* Declares a recursive chirp function as a property of
* the ninja object. We now need to call the method from
* within itself using the reference to the object's method
*/
var ninja = {
chirp: function(n) {
return n > 1 ? ninja.chirp(n-1) + "-chirp" : "chirp";
}
};
ninja.chirp(3);
4.2.3 The pilfered reference problem
The last example relied on the fact that we had a reference to the function to be called recursively in the property of an object. But unlike a function's actual name, such reference may be transient, and relying upon them can trip us up in confounding ways.
var ninja = {
chirp: function(n) {
return n > 1 ? ninja.chirp(n-1) + "-chirp" : "chirp";
}
};
var samurai = { chirp: ninja.chirp };
ninja = {};
samurai.chirp();
4.2.4 Inline named functions
There's nothing wrong with giving any function literal a name, even those that are declared as callbacks or methods. These functions are called inline functions.
var ninja = {
chirp: function signal(n) {
return n > 1 ? signal(n-1) + "-chirp" : "chirp";
}
};
var samurai = { chirp: ninja.chirp };
ninja = {};
samurai.chirp();
Even though inline functions can be named, those names are only visible within the functions themselves. It act somewhat like variable names, and their scope is limited to the function within which they're declared.