手动封装call和apply方法

Function.prototype.call = function () {

   var obj = arguments[0] || window;

   var arr = [];

   obj.fn = this;

if (arguments.length > 1) {

for (var i = 1; i < arguments.length; i++) {

arr.push('arguments[' + i + ']');

}

arr = arr.join(',');

console.log(arr);

var result = eval('obj.fn(' + arr + ')')

扫描二维码关注公众号,回复: 1497852 查看本文章

} else {

var result = obj.fn();

console.log(1);

}

delete obj.fn;

return result;

}

Function.prototype.apply = function(obj, arr){

var result;

obj.fn = this;

if(arr){

var newArr = [];

for(var i = 0; i < arr.length; i++){

newArr.push('arr[' + i +']');

}

newArr = newArr.join(',');

result = eval('obj.fn('+ newArr +')')

}else{

result = obj.fn();

}

delete obj.fn;

return result;

}

function test(arr,str){

console.log(arr);

console.log(str);

}

test.apply(window, [12,23]);

test.call(window, 12,23);

猜你喜欢

转载自my.oschina.net/u/3878260/blog/1824682