The bind() method was added in ESMAScript 5, but it is easy to simulate in ESMAScrpt 3. As its name implies, the primary purpose of bind() is to bind a function to an object. When you invoke the bind() method on a function f and pass an object o,the method returns a new function. Invoking the new function (as a function) invokes the original function f as a method of o. Any arguments you pass to the new function are passed to the original function. For example:

function f(y) { return this.x + y; }  // This function need to be bound
          var o = { x:1 };                            //  An object we'll bind to
          var g = f.bind(o);                         //  Calling g(x) invokes o.f(x)
          g(2);                                           //  => 3

It's easy to accomplish this kind of binding with code like the following:

//Return a function that invokes f as a method of o, passing all its arguments.
          function bind(f,o) {
             if (f.bind) return f.bind(o);      // Use the bind method, if there is one.
            else return function() {           // Otherwise, bind it like this
                  return f.apply(o, arguments);
             };
          }

The ECMAScript 5 bind() method does more than just bind a function to an object. It also performs partial application: any arguments you pass to bind() after the first are bound along with the this value. Partial application is a common  technique in functional programming and is sometimes called currying. Here are some examples of the bind() method used for partial application:

var sum = function(x,y) { return x + y };           // Return the sum of 2 args
          // Create a new function like sum, but with the this value bound to null
          // and the 1st argument bound to 1. This new function expects just one arg.
          var succ = sum.bind(null,1);
          succ(2)                // => 3: x is bound to 1, and we pass 2 for the y argument

function f (y,z) { return this.x + y + z };     // Another function that adds
          var g = f.bind({x:1},2);                              // Bind this and y
          g(3);                                                        //  => 6: this.x is bound to 1, y is bound to 2 and z is 3

We can bind the this value and perform partial application in ECMAScript 3. The standard bind() method can be simulated with the code like that shown in Example 8-5.

Note that we save this method as Function.prototype.bind, so that all function objects inherit it. This technique is explained in detail in 9.4

Example 8-5. A Function.bind() method for ECMAScript 3

if (!Function.prototype.bind) {
     Function.prototype.bind = function(o /*, args */) {
            // Save the this and arguments values into variables so we can 
            // use them in the nested function below。
           var self = this, boundArgs = arguments;

// The return value of the bind() method is a function
           return function() {
                // Build up an argument list, starting with any args passed 
                // to bind after the first one, and follow those with all args
                // passed to this function.
                var args = [], i;
                for(i=1; i < boundArgs.length; i++) args.push(boundArgs[i]);
                for(i=0; i < arguments.length; i++) args.push(arguments[i]);

// Now invoke self as a method of o, with those arguments
                return self.apply(o, args);
           };
       };
}

Notice that the function returned by this bind() method is a closure that uses the variables self and boundArgs declared in the outer function, even though that inner function has been returned from the outer function and is invoked after the outer function has returned.

The bind() method defined by ECMAScript 5 does have some features that cannot be simulated with ECMAScript 3 code shown above. First, the true bind() methed return a function object with its length property properly set to the arity of the bound function minus the number of bound arguments (but not less than zero). Second, the ECMAScript 5 bind() method can be used for partial application of constructor functions. If the function returned by bind() is used as a constructor, the this passed to bind() is ignored, and the original function is invoked as a constructor, with some arguments already bound. Functions returned by the bind() method do not have a prototype property (the prototype property of rgular functions cannot be deleted) and objects created when these bound functions are used as constructors inherit from the prototype of the original, unbound constructor. Also, a bound constructor works just like the unbound constructor for the purposes of the instanceof operator.

The bind() Method的更多相关文章

  1. jQuery 中bind(),live(),delegate(),on() 区别(转)

    当我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 准备知识: 当我们在开始的时候,有些知识是必须具备的: D ...

  2. 转 jQuery 中bind(),live(),delegate(),on() 区别

    当我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 准备知识: 当我们在开始的时候,有些知识是必须具备的: D ...

  3. 【转载】JS中bind方法与函数柯里化

    原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...

  4. Delegate, Method as Parameter.

    代理, 将方法作为另一方法的参数. 类似C里面的函数指针. using System; using System.Windows.Forms; using System.Threading; name ...

  5. js的bind方法

    转载:http://www.jb51.net/article/94451.htm http://www.cnblogs.com/TiestoRay/p/3360378.html https://seg ...

  6. jquery实现input输入框实时输入触发事件代码 ---jQuery 中bind(),live(),delegate(),on() 区别

    复制代码 代码如下: <input id="productName" name="productName" value="" /> ...

  7. bind() live()和delegate 区别

    Event bubbling (aka event propagation)冒泡 我们的页面可以理解为一棵DOM树,当我们在叶子结点上做什么事情的时候(如click一个a元素),如果我们不人为的设置s ...

  8. Function.prototype.bind接口浅析

    本文大部分内容翻译自 MDN内容, 翻译内容经过自己的理解. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glo ...

  9. jQuery事件绑定方法bind、 live、delegate和on的区别

    我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 1.准备知识 当我们在开始的时候,有些知识是必须具备的: 1 ...

随机推荐

  1. window10下载安装jieba

    下载安装jieba的过程如下: 1 下载jieba 2 将其解压到E:\python2,如图所示: 3 在桌面左下角搜索框中输入"运行",之后输入"cmd".再 ...

  2. 【JZOJ4895】【NOIP2016提高A组集训第16场11.15】三部曲

    =v= 因为外来的入侵,国王决定在某些城市加派士兵.所有城市初始士兵数量为0.当城市 被加派了k名士兵时.城市i的所有子城市需要被加派k+1名士兵.这些子城市的所有子城市需要被加派k+2名士兵.以此类 ...

  3. Failed to delete access_log

    重复build 关闭已经开启的tomcat    terminal 再次开启即可

  4. JavaScript —— 常用数据类型隐式转换

    公用方法: let checkType = (data) => { if(data){ console.log(true); }else{ console.log(false); } } 一.字 ...

  5. TIJ——Chapter Six:Access Control

    package:the library unit The levels of access control from "most access" to "least ac ...

  6. Android横竖屏切换和灭屏亮屏时Activity的生命周期探究(1)

    研究这个问题的初衷在于项目中碰到了一个问题:横屏的时候灭屏再亮屏,亮屏的时候用户能够清晰的看到先启动竖屏(过程1)再切换到横屏的过程,因为灭屏的时候onSaveInstanceState()保存的时横 ...

  7. oracle函数 lag()和lead()

    [语法] lag(EXPR,<OFFSET>,<DEFAULT>) LEAD(EXPR,<OFFSET>,<DEFAULT>) [功能]表示根据COL1 ...

  8. qt 利用Qtimer 定时器实现定时消息发送

    为了实现给控制器按周期发送控制指令,利用qt中的Qtimer 实现消息的定时发送. 需要进行三步处理: 1.在mainwindow.h文件中对timerEvent进行声明 public virtual ...

  9. HZOJ 辣鸡(ljh)

    题解?noipT1还需要题解?正解就是$n^2$大暴力. 考试的时候打了$n^2$的暴力,也想到了正解的优化,然而觉得它太麻烦了,而且$n^2$怎么优化也过不了50000啊,而且即使不优化前面30分我 ...

  10. [wikipedia] List of free and open-source software packages

    List of free and open-source software packages From Wikipedia, the free encyclopedia     This articl ...