您的位置:首页 > Web前端 > JavaScript

Secret of the JavaScript Ninja 学习笔记 - 5

2013-02-15 12:58 791 查看

第四章 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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息