概述
在ECMA-262第五版引入了bind()方法,该方法创建一个新函数。
语法
fn.bind(context[, arg1[, arg2[, ...]]])
第一个参数context将成为返回的新函数的this对象
第二个及以后的参数加上绑定函数运行时本身的参数按照顺序,将作为新函数的擦书
实现原理
Function.prototype.bind = function (context) {
// 调用Array的方法来切割伪数组对象arguments
// 由此获此bing()方法传进来的第二个及以后的参数
var args = Array.prototype.slice.call(arguments, 1);
return function () {
return this.apply(context, args.concat(Array.prototype.slice.call(arguments)));
};
};
其核心思想就是返回一个函数,函数里是通过用apply指定this值的原函数的返回值。
常见应用场景
- 改变对象方法里this的值
var ob = {
name: 'joe',
getName: function () {
alert(this.name);
}
};
// 改变getName方法里原本的this对象为新对象{name: 'haha'}
var app = ob.getName.bind({name: 'haha'});
app();<