javascript中函数闭包

Category:
发表:

闭包在js中是一个非常常见的语法糖。下面将会介绍如何实现一个函数闭包。

看下面的代码

1
2
3
4
5
6
var closure = function() {
var arg = arguments;
return function() {
arg[0].apply(arg[1], Array.prototype.slice.call(arg).slice(2));
};
};

函数closure接受一组参数,

  • 第一个参数是一个Function
  • 第二个参数是一个函数上下文
  • 第三个以及后面的参数都是可选的,将会被apply到第一个参数(也是一个函数)中作为形式参数。

函数closure将会返回一个function reference, 即它的返回值仍然是一个Function

我们可以将closure直接添加到Function.prototype,将原生对象扩展,这样所有的js函数都天生具有了closure方法。不过通常我们不推荐直接扩展原生对象

另一种方式,我们可以借助underscoremixin方法,来扩展underscore的内置方法。如下:

1
2
3
_.mixin({
closure: closure
});

下面是一些测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var foo = function(name) {
console.log(this.name);
console.log(name);
};

foo('Pajjket');

var foo2 = _.closure(foo, {
name: 'Gee',
sex: 'male',
age: 25
}, 'Pajjket Gee');

foo2();

下面是测试的输出结果:

1
2
3
4
        // 在chrome环境中,这里是一个空字符串
Pajjket
Gee
Pajjket Gee