类数组转为数组(call apply)
- arguments 是类数组,无法直接调用 Array.prototype 上的方法
function mySum() {
let ary = Array.prototype.slice.call(arguments);
console.log(ary)
let result = 0;
Array.prototype.forEach.call(arguments, item => {
result += item;
});
return result;
}
let sum = mySum(1, 2, 3, 4, 5);
console.log(sum);
bind 不立即执行的应用
let obj = {
name: 'patrick',
age: 12
}
function fn(x, y) {
console.log(this, x, y);
}
window.onclick = fn;
window.onclick = fn.call(obj, 10, 20);
window.onclick = fn.bind(obj, 10, 20);
重写 call
Function.prototype.call = function call(context, ...params) {
context = Object(context);
let proxy = Symbol('fn');
context[proxy] = this;
let result = context[proxy](...params);
delete context[proxy];
return result;
}
let obj = {
name: 'patrick',
age: 12
};
function fn(x, y) {
console.log(this, x, y);
return x + y;
};
fn.call(obj, 10, 20);
重写 bind
Function.prototype.bind = function bind(context, ...params) {
let that = this;
return function proxy(...innerParams) {
params.concat(innerParams);
that.call(context, ...params);
}
}
let obj = {
name: 'patrick',
age: 12
};
function fn(x, y) {
console.log(this, x, y);
return x + y;
};
window.onclick = fn.bind(obj, 10, 20);