JavaScript学习笔记【call()、apply()、bind()函数】

196 阅读2分钟

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…