黑铁时代
Programing is not only one kind of technology, but also one kind of art.

  JavaScript中的this是根据执行环境来确定。如果函数在全局环境中被调用,this就会指向window;如果某个函数当做某个对象的方法被调用,那么通常情况下this就指向该对象。这里说通常情况是因为在JavaScript中可以通过apply和call方法显示的改变函数的执行环境。

  有的时候,我们需要为某个函数绑定执行环境,让这个函数始终在一个指定的执行环境中执行,这种方式就叫函数绑定。在很多JavaScript库中都实现了一个bind方法,可以为函数绑定执行环境。

  例子:

  Function.prototype.bind = function() {

    var fn = this; // 将函数保存起来

    var context = arguments[ 0 ]; // 将指定的执行环境保存起来

    return function() {

      fn.apply( context, arguments ); // 在绑定的执行环境下执行函数

    }

  }

  myContext = {

    name: 'Leo Context',

    callback: function() {

      console.log( this.name );

    }

  }

  var div = document.getElementById('myDiv');

  div.addEventListener( 'click', myContext.callback.bind( myContext ) );

  我们在Function的原型中添加一个bind方法,所有的函数都会共享这个方法。这个方法的目的是用闭包的方式将函数(myContext.callback)和执行环境(myContext)保存外部的作用域中,然后返回一个闭包的函数,当这个被返回的函数被执行的时候,就会将myContext.callback在myContext的执行环境下执行。我们这里是将callback的执行环境设回myContext,如果这里不进行函数绑定,那么callback的执行环境就会变成div。

posted on 2012-07-28 10:24  黑铁时代  阅读(265)  评论(0编辑  收藏  举报