call
语法:
fun.call(thisArg,arg1,arg2,...)
,调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。
apply
语法:
func.apply(thisArg,[argsArray])
,调用一个函数,以及作为一个数组(或类似数组对象)提供的参数。
Function.call
按套路实现
call
核心:
-
将函数设为对象的属性
-
执行&删除这个函数
-
指定
this
到函数并传入给定参数执行函数 -
如果不传入参数,默认指向为 window
为啥说是套路实现呢?因为真实面试中,面试官很喜欢让你逐步地往深考虑,这时候你可以反套路他,先写个简单版的:
var foo = {
value: 1,
bar: function() {
console.log(this.value)
}
}
foo.bar()
// 1
当面试官有进一步的发问,或者此时你可以假装思考一下。然后写出以下版本:
Function.prototype.call2 =
function (content = window) {
content.fn = this;
let args = [...arguments].slice(1);
let result = content.fn(...args);
delete content.fn;
return result;
}
var foo = { value: 1 }
function bar (name, age) {
console.log(name)
console.log(age)
console.log(this.value);
}
bar.call2(foo, 'black', '18')
// black 18 1
Function.apply
的模拟实现
apply()
的实现和 call()
类似,只是参数形式不同。直接贴代码吧:
Function.prototype.apply2 = function (context = window) {
context.fn = this
let result;
// 判断是否有第二个参数
if (arguments[1]) {
result = context.fn(...arguments[1])
} else {
result = context.fn()
}
delete context.fn()
return result
}