0%

call和apply的模拟实现

call的特点

  • 可以改变当前函数的this指向
  • 让当前函数执行

call模拟实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Function.prototype.call = function (context) {
var context = context ? Object(context) : window;// 兼容context,Object(context)兼容context为string的情况
context.fn = this; // 将函数设为对象的属性

var args = [];
//获取参数
for(var i = 1, len = arguments.length; i < len; i++) {
args.push('arguments[' + i + ']');
}

// 执行函数
// args 会自动调用 Array.toString() 这个方法
var result = eval('context.fn(' + args +')');
// 删除该函数
delete context.fn;
//返回结果
return result;
}

apply 模拟实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Function.prototype.apply = function (context, args) {
var context = context ? Object(context) : window;// 兼容context,Object(context)兼容context为string的情况
context.fn = this; // 将函数设为对象的属性
var result = null;
// 执行函数
if (!args) {
// 没有传参直接直接函数
result = context.fn()
} else {
arr = [];
for (var i = 0, len = args.length; i < len; i++) {
arr.push('args[' + i + ']');
}
// arr 会自动调用 Array.toString() 这个方法
result = eval('context.fn(' + arr + ')');
}
// 删除该函数
delete context.fn;
//返回结果
return result;
}
-------------本文结束感谢您的阅读-------------