今天研究了一下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原型)的一个实例对象。