js中闭包来实现bind函数的一段代码的分析

今天研究了一下bind函数,发现apply和call还可以有这样的妙用,顺便巩固复习了闭包。

 1 var first_object = { 
 2 num: 42 
 3 }; 
 4 var second_object = { 
 5 num: 24 
 6 }; 
 7 function multiply(mult) { 
 8 return this.num * mult; 
 9 } 
10 Function.prototype.bind = function(obj) { 
11 var method = this, 
12 temp = function() { 
13 return method.apply(obj, arguments); 
14 }; 
15 return temp; 
16 } 
17 var first_multiply = multiply.bind(first_object); 
18 first_multiply(5); // returns 42 * 5 
19 var second_multiply = multiply.bind(second_object); 
20 second_multiply(5); // returns 24 * 5 

在以上代码中,实现的最核心其实是

10 Function.prototype.bind = function(obj) { 
11 var method = this, 
12 temp = function() { 
13 return method.apply(obj, arguments); 
14 }; 

这段代码在Function.prototype上添加了一个名为bind的方法,该方法首先保存当前上下文,然后在闭包中使用这个上下文,闭包是一个函数,实现了可以返回保存的上下文和obj上下文相链接,bind方法返回闭包函数,闭包可使用bind方法的上下文,闭包返回的其实是obj的一个方法,这个方法有点特殊,它可以使用obj内部的变量,也可以接受外部传入的变量,所以这个闭包站在了外部和内部作用域的中间,这一切的形成依赖于闭包依赖于method说保存的那个this上下文,其实在下面的实例中,我们可以发现,这个method就是下面的multiply函数的上下文,因为multiply它是Function类(准确的说应该是funtion.prototype原型)的一个实例对象。

posted @ 2015-04-24 13:46  admos  阅读(1177)  评论(0编辑  收藏  举报