alterContext(function() {return this.greeting + ', ' + this.name + '!'; }, {name: 'Rebecca', greeting: 'Yo' })
Yo, Rebecca!
alterContext(function() {return this.greeting + ', ' + this.name + '!'; }, {name: 'Rebecca', greeting: 'Yo' })Yo, Rebecca!
function alterContext(fn, obj) {
return fn.call(obj,obj);
}
function alterContext(fn, obj) {returnfn.apply(obj);}
function alterContext(fn, obj) {returnfn.call(obj);}
function alterContext(fn, obj) {constbindedFn = fn.bind(obj);returnbindedFn();}
function alterContext(fn, obj) {
obj.fn = fn;
return obj.fn();
} 四种答案,任君选择。
//原生js法:
function alterContext(fn, obj) {
obj.temp = fn;
let result = obj.temp();
delete obj.temp;
return result
} //另外三种es6新增的方法
function alterContext(fn, obj) {
return fn.bind(obj)();//.bind()返回的是一个函数,所以需要立即执行。 }
function alterContext(fn, obj) {
return fn.call(obj);
}
function alterContext(fn, obj) {
return fn.apply(obj);
}
if(!Function.prototype.call) {
Function.prototype.call = function(ctx) {
var args = []
ctx.fn = this
for (var i = 1; i < arguments.length; i++) {
args.push('arguments['+ i +']')
}
var result = eval('ctx.fn('+ args +')')
}
}
if(!Function.prototype.apply) {
Function.prototype.apply = function(ctx) {
var args = []
ctx.fn = this
for (var 0 = 1; i < arguments[1].length; i++) {
args.push('arguments['+ i +']')
}
var result = eval('ctx.fn('+ args +')')
}
}
if(!Function.prototype.bind) {
Function.prototype.bind = function(ctx) {
var fTobind = this
var slice = Array.prototype.slice
var baseArgs = slice.call(arguments, 1)
var fBound = function() {
return fTobind.apply(this instance of fBound ? this : ctx, baseArgs.concat(slice(arguments)))
}
fBound.prototype = Object.create(fTobind.prototype)
fBound.prototype.conctructor = fBound
return fBound
}
}