JavaScript函数详解(2)
(function() { // 匿名函数
function log(msg) {
console.log(msg);
}
// 其他代码
}()); // 立即执行
以上代码就是一个简单的示例,log函数的作用域被限制在这个匿名函数之内,而匿名函数则因为被外面一对小括号()包括起来,形成一个函数表达式,表达式的值是一个函数,紧接着一对小括号表示立即执行这个函数,让原有的代码正常执行一次。不过,这种方式声明的函数、通过var声明的变量等等都是内部的,不能被任何匿名函数以外的代码访问到。如果你需要对外暴露一些函数作为接口的话有如下几种方法:
var mylib = (function(global) {
function log(msg) {
console.log(msg);
}
log1 = log; // 法一:利用没有var的变量声明的默认行为,在log1成为全局变量(不推荐)
global.log2 = log; // 法二:直接在全局对象上添加log2属性,赋值为log函数(推荐)
return { // 法三:通过匿名函数返回值得到一系列接口函数集合对象,赋值给全局变量mylib(推荐)
log: log
};
}(window));
2.2 高阶函数(High-order Function)
如果函数作为参数或返回值使用时,就称为高阶函数,JavaScript中的函数都可以作为高阶函数来使用,这也是第一类函数的特征。下面我们就分别分析一下这两种使用方法。
function negative(n) {
return -n; // 取n的相反值
}
function square(n) {
return n*n; // n的平方
}
function process(nums, callback) {
var result = [];
for(var i = 0, length = nums.length; i < length; i++) {
result[i] = callback(nums[i]); // 对数组nums中的所有元素传递给callback进行处理,将返回值作为结果保存
}
return result;
}
var nums = [-3, -2, -1, 0, 1, 2, 3, 4];
var n_neg = process(nums, negative);
// n_neg = [3, 2, 1, 0, -1, -2, -3, -4];
var n_square = process(nums, square);
// n_square = [9, 4, 1, 0, 1, 4, 9, 16];
以上代码展示了把函数作为参数传入另一个函数process调用的示例,在process函数的实现中,把callback作为一个黑盒子看待,负责把参数传给它,然后获取返回值,在调用之前并不清楚callback的具体实现。只有当执行到20行和22行时,callback才被分别代表negative或square,分别对每个元素进行取相反值或平方值的操作。
function generator() {
var i = 0;
return function() {
return i++;
};
}
var gen1 = generator(); // 得到一个自然数生成器
var gen2 = generator(); // 得到另一个自然数生成器
var r1 = gen1(); // r1 = 0
var r2 = gen1(); // r2 = 1
var r3 = gen2(); // r3 = 0
var r4 = gen2(); // r4 = 1
- 上一篇:PHP PDO操作总结
- 下一篇:提升PHP安全:8个必须修改的PHP默认配置