咱們知道call和apply方法的做用基本同樣,主要的區別在於第二個參數的傳遞,call直接傳遞參數便可,apply的須要傳遞一個參數列表。
所以call和apply的實現原理基本相同,能夠參考https://segmentfault.com/a/11...
這樣咱們就直接上最終版的實現代碼,以下segmentfault
Function.prototype.apply2 = function (context, arr) { context = context || window var args = [] //遍歷參數列表中的數據而後添加到args數組中 for (var i = 0; i < arr.length; i++) { args.push('arr[' + i + ']') } // 在obj對象中添加fn屬性,而且fn的值爲函數bar context.fn = this // 執行fn方法,並返回值 const result = eval('context.fn(' + args + ')') // 執行fn方法結束後,刪除添加到obj中的fn方法 delete context.fn return result } var obj = { value: 1 } function bar(name, age) { console.log(name, age) return { value: this.value, name, age } } console.log(bar.apply2(obj, ['張三', 18]))
使用ES6方法實現以下數組
Function.prototype.apply2 = function (context, arr) { context = context || window let fn = Symbol() context.fn = this const result = context.fn(...arr) delete context.fn return result } var obj = { value: 1 } function bar(name, age) { console.log(name, age) return { value: this.value, name, age } } console.log(bar.apply2(obj, ['張三', 18]))