1、返回函数的函数
代码示例:
function getFunc(argument) { return function() { console.log("new function"); } } var newFunc = getFunc(); newFunc(); // 调用返回的函数
因为函数始终都会有一个返回值,即便不是显式返回,它也会隐式返回一个undefined。既然函数能返回一个唯一值,那么这个值就也有可能是另一个函数。
2、内部函数
代码示例:
function outer(param) { var inner = function(theinput) { return theinput * 2; } return inner(param); } console.log(outer(2)); // 输出 4 console.log(typeof inner) // 输出 undefined
本地函数 inner 在 outer 以外的地方是不可见的,所以我们将它称之为内部私有函数。使用内部私有函数的好处就是,我们只需要将一些必要的函数暴露给“外部世界”,隐藏内部的实现细节。
3、匿名函数
代码示例:
function one() { return 1; } function two() { return 2; } function add(one, two) { return one() + two(); } var num = add(one, two); console.log(num); // 输出3
又或者如下定义:
function add(one, two) { return one() + two(); } var num = add( function() { return 1; }, function() { return 2; } ); console.log(num); // 输出 3
在 Javascript 中使用匿名函数的方式,一般用于执行一次性任务,并且代码显的更简洁,也有助于提升性能,当我们将函数 A 作为参数传递给函数 B,并由 B 来执行 A 时,A 就成了一个回调函数。如果这时 A 还是一个匿名函数,我们就称它为匿名回调函数。使用这个特性,我们再来实现一个对数组中每个数求平方值的例子:
function testSquare(items, callback) { var i, result = []; for (i = 0; i < items.length; i++) { result[i] = callback(items[i]); } return result; } var result = testSquare([2, 3, 4], function(num) { return num ** 2; }); console.log(result); // 输出 [ 4, 9, 16 ]
4、即时函数
在 JavaScript 中即时函数表示可以在定义后立即调用。通常适合于执行一些一次性的或初始化的任务。好处是不会产生任何全局变量,当然,缺点在于这样的函数是无法重复执行的。主要定义的方式有如下三种:
// 第一种定义方式 (function() { console.log("init...") })();
// 第二种定义方式 (function() { console.log("init...") }());
// 第三种定义方式 var num = function() { return 1; }(); console.log(num); // 输出 1
参考书籍:《JavaScript面向对象编程指南》