繁体   English   中英

任何天才能告诉我这个小代码中发生了什么吗? 来自JavaScript Ninja的秘密

[英]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 这将在以后应用时用作fnthis值。

  return function(){ 

返回一个充当部分应用方法的函数。 调用此函数

 return fn.apply(object, 

调用该函数的左.bind传递到第一个参数bindthis apply是一种特殊的反射函数方法,它允许调用一个函数,该函数的参数类似于python中的*args**kwargs ,或者是Java中的...

  args.concat(Array.prototype.slice.call(arguments))); 

作为参数传递给fnbind的参数后跟闭包的参数。

假设我们有一个功能

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM