# call和apply模拟实现
# call 原理
call()
方法使用一个指定的 this
值和单独给出的一个或多个参数来调用一个函数
# apply 原理
apply()
方法接受的是一个包含多个参数的数组,语法和作用与 call()
类似
# 代码实现
- call
Function.prototype.call = function(context) {
context = context ? Object(context) : window
var fn = Symbol()
context[fn] = this
let args = [...arguments].slice(1)
let result = context[fn](...args)
delete context[fn]
return result
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- apply
Function.prototype.apply = function(context, arr) {
context = context ? Object(context) : window
context.fn = this
var result
if (!arr) {
result = context.fn()
} else {
var args = []
for(var i = 0, len = arr.length; i < len; i++) {
args.push(`arr[${i}]`)
}
result = eval(`context.fn(${args})`)
}
delete context.fn
return result
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18