Javascript Function.prototype.bind的变化我想确保我理解

时间:2011-08-31 21:36:07

标签: javascript

我正在浏览一些长期离开的开发人员留下的一些代码并且遇到了这个:

Function.prototype.binding = function ()
{
  if(arguments.length < 2 && typeof arguments[0] == "undefined") return this;
  var __method = this, args = jQuery.makeArray(arguments), object = args.shift();
  return function()
  { return __method.apply(object, args.concat(jQuery.makeArray(arguments))); };
};

并且它在其他几个地方被引用,这个DataTables回调函数是代表性的:

"fnRowCallback": function (nRow, aData, iDisplayIndex)
  {
    nRow = this.options.fnRowCallback(nRow, aData, iDisplayIndex);
    return nRow;
  }.binding(this),

我认为这样做的目的是将函数中的 this 上下文设置为传递给.binding的对象;那是对的吗?这种做法是不错的做法?

谢谢, 马修

2 个答案:

答案 0 :(得分:1)

代码正在做的是向Function原型添加一个方法binding。由于Function是一个javascript对象(函数是javascript中的对象),这基本上为默认的javascript行为添加了一个方法。

这是js框架中的常见做法。此特定方法似乎允许您设置方法的范围。在第二个示例中,您可以将binding(this)更改为binding(someObj),当方法执行时,方法范围内的this将为someObj

答案 1 :(得分:1)

  

我认为这样做的目的是将函数中的this上下文设置为传递给.binding的对象

正确。它还可以选择接受一些额外的参数,这些参数在调用时传递给函数。因此,如果您obj.f.binding(obj, 1, 2, 3)(4, 5, 6) obj.f1, 2, 3, 4, 5, 6收到的论据将为{{1}}。

此方法重现标准的ECMAScript第五版方法Function#bind,但命名方式不同,大概是因为它不完全符合该方法定义的接口。