javascript的任何函数的作用域中都有一个this变量。理解这个this变量才能正确地编写javascript程序,正确使用javascript的各种功能。
this变量是这样确定的:
1 如果函数未调用过bind:
a. 使用点运算符调用,等于调用时左边的点运算符左边的对象。
b. 不使用点运算符调用,等于window。
2 如果函数调用过了bind:
a. 通过new调用,等于新的对象(this)。
b. 不通过new调用,
1) 绑定时最左边参数为null或undefined,等于window
2) 绑定时最左边参数非null,必然等于该参数
bind的作用是从左到右为函数绑定参数。绑定的第一个参数总是null。这个函数本质上会返回一个闭包,因此能够可靠的保存下调用上下文。
msdn给出了一个bind的实现,这里稍作注释:
Function.prototype.bind = function(oThis) { //只有一个参数,事实上可以有变化个数,在函数中会处理 if(typeof this !== 'function') { //确保bind是对function调用,而不是其他对象 throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); } var fSlice = Array.prototype.slice; aArgs = fSlice.call(arguments, 1); //把除了重定义this的其他参数拿出来 fToBind = this; fNOP = function() {}; //它存在的意义完全是处理用new调用bind后函数的情况 fBound = function() { return fToBind.apply(this instanceof fNOP ? this : oThis || window, aArgs.concat(fSlice.call(arguments))); //重新定义this,如果this 是fNOP说明正在用new调用,则不使用bind的this,因为此时这个函数是作为新对象的构造函数 }; fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); //相当于定义了一个原函数的子类 return fBound; };