前端笔试题13 Function.prototype.call.bind

下面这段代码输出结果是什么呢?

Function.prototype.san = function () {
    return Function.prototype.call.bind(this);
};
console.log(Array.prototype.push.san()([], 1, 2));

答案:

2

解析:
在做这道题之前,一定要保证自己明白什么是原型,什么是callapplybind,如果不太明白或者没有听说过的话,那赶快去恶补一下吧,接下来进入正题,很多同学可能没有见过将call和bind这两个关键字一块使用的,改变this指向用一种方法不就可以达到想要的效果了吗,这段代码简直是魔鬼套娃啊(第一次做的时候我也是这么想的(*^▽^*),其实不然,如果简化一下上面得代码,变为这样,是不是就好理解一些了呢?

var san  = Function.prototype.call.bind(Array.prototype.push);
console.log(san([], 1, 2));

可能有些同学还是不懂,那么来看一下一个实例,给定一个字符串,然后将其转化为一个用指定字符连接的新字符串,如何实现?看起来非常简单,上手一发join()

console.log('abc'.join('|'));

结果报错了:

TypeError: “abc”.join is not a function

新人(比如我)还在傻眼:字符串不是特殊的数组吗,那就可以调用数组的一些方法啊,而且本地编辑器并没有报错,老手已经开始使用原型来借助方法了:

console.log(Array.prototype.join.call('abc', '|'));

运行无误,看到这里是不是对上面的题有了思路了?首先将Array原型上的push方法利用bind方法将this绑定到给出的数组上形成一个新的函数,然后在通过call方法绑定到Function上,这样就可以实现原型对象方法的调用。
参考博客:https://www.cnblogs.com/gaoht/p/10978751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值