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 } }