一、改变上下文
在JavaScript中,函数是一种对象,其上下文是可以变化的,对应的,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,可以通过Function对象中的call或者apply方法来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数。将函数 fn 的执行上下文改为 obj 对象,只需要将obj作为call或者apply的第一个参数传入即可。
function alterContext(fn, obj) { return fn.call(obj,obj); }共有四种正确方案(按提交的运行时间由快到慢排列):
1. apply 方法改变函数 this 值
function alterContext(fn, obj) {
returnfn.apply(obj);
}
2. call 方法改变函数 this 值
function alterContext(fn, obj) {
returnfn.call(obj);
}
3. bind 方法创建指定 this 值的函数实例
function alterContext(fn, obj) {
constbindedFn = fn.bind(obj);
returnbindedFn();
}
4. 给 obj 增加 fn 方法
function alterContext(fn, obj) { obj.fn = fn; return obj.fn(); }
案例:
var res = alterContext(function() { return this.greeting + ', ' + this.name + '!'; }, { name: 'Rebecca', greeting: 'Yo' }) console.log(res) function alterContext(fn, obj) { return fn.call(obj) }