JavaScript学习笔记【call()、apply()、bind()函数】
背景引入
首先看一下小莫_yu博客的两个例子
例1
obj.myFun() //小张年龄undefined
例2
shows() //盲僧
比较一下这两者this 的差别
- 第一个打印里面的this 指向obj,
- 第二个全局声明的shows()函数,this 是window ;
注意以上代码在浏览器可以运行,在nodejs中不成立。nodejs没有window,所以打印出来是 undefined
最后我们知道call()、apply()、bind() 的出现都是用来重定义 this 这个对象的!
call()、apply()、bind()的使用
var db = {
name:'掘金',
age:100
}
obj.myFun.call(db); //掘金年龄100
obj.myFun.apply(db); //掘金年龄100
obj.myFun.bind(db)(); //掘金年龄100
除了bind 方法后面多了个 () 外 ,结果返回都一致!
var obj = {
myFun:function(fm,t){
console.log(this.name + "年龄" + this.age,"喜欢"+fm+"不喜欢"+t);
}}
obj.myFun.call(db,'红色','绿色');
obj.myFun.apply(db,['红色','绿色']);
obj.myFun.bind(db,'红色','绿色')();
obj.myFun.bind(db,['红色','绿色'])();
//输出结果
//掘金年龄100 喜欢红色不喜欢绿色
//掘金年龄100 喜欢红色不喜欢绿色
//掘金年龄100 喜欢红色不喜欢绿色
//掘金年龄100 喜欢红色,绿色不喜欢undefined
可以看出call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数具有差别:
- call的参数是直接放进去的,第2、第3、第n个参数全都用逗号分隔,直接放到后面
obj.myFun.call(db,'红色', ... ,'string' );
- apply的所有参数都必须放在一个数组里面传进去
obj.myFun.apply(db,['红色', ..., 'string' ]);
- bind除了返回是函数以外,它的参数和call 一样。 当然,三者的参数不限定是string类型,允许是各种类型
参考文献: [1] www.cnblogs.com/Shd-Study/p…