题目描述
将函数 fn 的执行上下文改为 obj 对象
示例1
输入
function () {return this.greeting + ', ' + this.name + '!!!';}, {greeting: 'Hello', name: 'Rebecca'}
输出
Hello, Rebecca!!!
var m = Object.getOwnPropertyNames(obj);
var v = m.forEach(function(ele,idx,m){
return obj[ele];
});
后来发现fn中使用了this.调用属性,所以呢!后来参考了其他人写的::
function speak(fn, obj) {
return fn.apply(obj,[]);
}
在JavaScript中,函数是一种对象,其上下文是可以变化的,对应的,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,可以通过Function对象中的call或者apply方法来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数。将函数 fn 的执行上下文改为 obj 对象,只需要将obj作为call或者apply的第一个参数传入即可。
1
2
3
|
function speak(fn, obj) {
return
fn.apply(obj, obj);
}
|
//三种方案
//apply
function
speak(fn, obj) {
return
fn.apply(obj);
}
//call
function
speak(fn, obj) {
return
fn.call(obj);
}
//bind
function
speak(fn, obj) {
return
fn.bind(obj)();
}
bind加括号的原因::因为call/apply是直接调用目标函数,bind只是返回目标函数,并不调用,所以要用()执行函数