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。