为什么会没有输出呢?上文已经提到了,这就是和bind、call的区别了
bind不会执行bar函数,只是改变了其this指向,并且给它传入了参数,添加一行代码呢?如下:
var foo = { value: 1};function bar(name, age) { console.log(name) console.log(age) console.log(this.value);}bar.bind(foo, 'kevin', 18);bar();// undefined// undefined// undefined
对的,你没看错,输出了三个undefined,因为虽然调用了bar(),但this指向了window且没有传入任何参数,理所当然都是undefined了,可见使用了bind后并不会改变原函数,其实call和apply也都不会改变原参数,也就是说call和apply是一次性的,这里为什么我没说bind呢,因为他会返回一个函数,如果我们保存这个函数,它就不是一次性的了,如果再执行这个函数就可以达到我们想要的效果了,注意:执行apply和call时,就如同执行原函数,返回值和原函数相同,如果原函数不返回值,则apply和call也不会返回任何值!
function fn(...args){console.log(this,args);}let obj = {myname:"张三"}const bindFn = fn.bind(obj); // this 也会变成传入的obj ,bind不是立即执行需要执行一次bindFn(1,2) // this指向objfn(1,2) // this指向window
小结从上面可以看到,apply、call、bind三者的区别在于:
- 三者都可以改变函数的this对象指向
- 三者第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window
- 三者都可以传参,但是apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入
- bind是返回绑定this之后的函数,apply、call 则是立即执行
- 修改this指向
- 动态传递参数
// 方式一:只在bind中传递函数参数fn.bind(obj,1,2)()// 方式二:在bind中传递函数参数,也在返回函数中传递参数fn.bind(obj,1)(2)
- 兼容new关键字
Function.prototype.myBind = function (context) {// 判断调用对象是否为函数if (typeof this !== "function") {throw new TypeError("Error");}// 获取参数const args = [...arguments].slice(1),fn = this;return function Fn() {// 根据调用方式,传入不同绑定值return fn.apply(this instanceof Fn ? new fn(...arguments) : context, args.concat(...arguments));}}
给大家分享我收集整理的各种学习资料,前端小白交学习流程,入门教程等回答-下面是学习资料参考 。【bind、call、apply 区别?如何实现一个bind?】
推荐阅读
- 最全的Word、Excel、PS、Windows、PPT常用快捷键,快收藏
- 什么编程语言性能最好?C语言无悬念第一、Python垫底
- 魅族|星纪时代战略投资魅族 李书福:未来汽车、手机将融为一体
- 恋爱先生 影评,恋爱先生豆瓣剧评-
- |职场上的新技术、新产品、新职位、新模式一直在不断改变和创新
- 随心的心情说说短句有哪些?
- 电动车|天下苦老头乐久矣 天津:禁止生产、销售违规低速电动车
- 毫米、厘米、分米、米、千米 mm是什么单位的的换算专项练习
- AMD|最受玩家追捧显卡、系统一览:CPU上AMD继续抢占Intel份额
- 小组名字有哪些?