[英]Can any genius tell me what's going on in this small code? From Secrets of the JavaScript Ninja
我几乎没有启动JavaScript,我想知道是否有任何天才可以帮助我逐行理解这一点?
1: Function.prototype.bind = function(){
2: var fn = this,
3: args = Array.prototype.slice.call(arguments),
4: object = args.shift();
5: return function(){
6: return fn.apply(object,
7: args.concat(Array.prototype.slice.call(arguments)));
8: };
9: };
我只是初学者,但如果你能教我,那你真棒。 我知道原型,调用,移位,应用一点,所以你可以跳过初学者部分(虽然我认为你不应该这样,其他几乎没有进入JS的人可能会学习如何)。
注意:我知道有一个“类似的代码” 在这里问一个类似的问题,但我要求逐行解释,他们不是(不重复)(另外,你可以跳过第8和第9行):)
这是EcmaScript 3中部分应用的EcmaScript 5 bind
方法的部分实现 。 它使
myObject.method.bind(myObject, 1, 2)(3, 4)
相当于
myObject.method(1, 2, 3, 4)
但它也更方便,因为你可以做到
var m = myObject.method.bind(myObject, 1, 2);
m(3, 4);
m(5, 6);
代替
myObject.method(1, 2, 3, 4);
myObject.method(1, 2, 5, 6);
Nit:这两个并不完全等价,因为如果第一次调用myObject.method
执行this.method = somethingElse;
然后绑定的方法仍然会调用原始方法。
要打破它:
Function.prototype.bind = function(){
向内置函数类型添加方法。
var fn = this,
存储this
应该是一个Function
正常使用,以便它可以封闭内部使用。
args = Array.prototype.slice.call(arguments),
创建一个包含bind
参数的数组。
object = args.shift();
从args
删除第一个参数并将其存储在object
。 这将在以后应用时用作fn
的this
值。
return function(){
返回一个充当部分应用方法的函数。 调用此函数
return fn.apply(object,
调用该函数的左.bind
传递到第一个参数bind
的this
。 apply
是一种特殊的反射函数方法,它允许调用一个函数,该函数的参数类似于python中的*args
或**kwargs
,或者是Java中的...
args.concat(Array.prototype.slice.call(arguments)));
作为参数传递给fn
, bind
的参数后跟闭包的参数。
假设我们有一个功能
function hi(a, b) { alert('hi! '+(a+b)); }
为每个函数定义一个函数(所以你可以使用例如hi.bind()
)
1: Function.prototype.bind = function(){
fn是this
,因此是原始函数(在我们的例子中this = hi
)
2: var fn = this,
arguments
(函数的参数)不是普通数组,因此以下是将其转换为包含与arguments
完全相同的元素的数组的技术
3: args = Array.prototype.slice.call(arguments),
移动args,返回第一个(这是你想要调用函数的上下文)
4: object = args.shift();
此函数返回一个新函数
5: return function(){
apply
是一个允许调用具有给定焦点和参数的函数的函数。 hi(2,3)
等于hi.apply(window, [2,3])
6: return fn.apply(object,
该函数将使用bind
参数和您传递给我们所在函数的任何其他参数调用( bind
返回)
7: args.concat(Array.prototype.slice.call(arguments)));
8: };
9: };
所以hi(2,3)
equals (hi.bind(window, 2, 3))()
equals (hi.bind(window, 2))(3)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.