看了很多关于这三种用法说明的博客,感觉还是没有菜鸟教程的教材简单直观,一下作为笔记加深理解
var name='张三',age =17;
var obj={
name:'李四',
objAge:this.age,
myFun:function(){
console.log(this.name+"哈哈哈"+this.age)
}
}
console.log(obj.objAge)//17
obj.myFun()//李四哈哈哈undefined
var fav='一点点';
function shows(){
console.log(this.fav)//一点点
上述代码中,第一个打印里面的this指向obj,第二个全局声明的shows函数里的this指向window。
1.call()、apply()、bind() 都是用来重定义 this 这个对象的!
var name='小王',age=17;
var obj={
name:'李四',
objAge:this.age,
myFun:function(){
console.log(this.name+"哈哈哈"+this.age)
}
}
var db={
name:'德玛',
age:99
}
obj.myFun.call(db); // 德玛哈哈哈99
obj.myFun.apply(db); // 德玛哈哈哈99
obj.myFun.bind(db)(); // 德玛哈哈哈99
以上方法除了bind()方法后面多出了个()外,结果返回都一致!
由此得出结论,bind返回的是一个新的函数,你必须调用它才会被执行。
2.对比call、bind、apply传参情况下
var name='小王',age=17;
var obj={
name:'小张',
objAge:this.age,
myFun:function(fm,t){
console.log(this.name+'年龄'+this.age,'来自'+fm+'去往'+t)
}
}
var db={
name:'德玛',
age:99
}
obj.myFun.call(db,'成都','上海'); // 德玛 年龄 99 来自 成都去往上海
obj.myFun.apply(db,['成都','上海']); // 德玛 年龄 99 来自 成都去往上海
obj.myFun.bind(db,'成都','上海')(); // 德玛 年龄 99 来自 成都去往上海
obj.myFun.bind(db,['成都','上海'])(); // 德玛 年龄 99 来自 成都, 上海去往 undefined
从以上四个结果可以看出,call,bind,apply这三个函数的第一个参数都是this的指向对象;
参数的区分:
1.call的参数是直接放进去的,第二第三第n个参数全部都用逗号分隔,直接放到后面obj.myFun.call(db,‘成都’, … ,‘string’ )。
2.apply的所有参数是必须放在一个数组里面传进去obj.myFun.apply(db,[‘成都’, …, ‘string’ ])
3.bind除了返回是函数以外,它的参数和call一样。
三者的参数均不限类型