JS中call(),apply(),bind()的用法

简单来说其实这三个函数基本上都是同一个功能
都是用来重定义 this 这个对象的

先看明白下面这两个例子
例1:

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

例2:

var book = '三体';
function showBook(){
	console.log(this.book);
}
showBook();//输出结果:三体

比较一下这两个例子中 this 的差别,例1 打印里面的 this 指向 obj例2 全局声明的 showBook() 函数中的 this 指向 window

  • call(),apply(),bind() 的作用都是用来重新定义 this 这个对象的
  • 代码示例:

    var name = '张三',age = 17;
    var obj = {
    	name:'李四',
    	objAge:this.age,
    	myFun:function(){
    		console.log('姓名:' + this.name + ', 年龄:' + this.age);
    	}
    }
    var kk = {
    	name:'王五',
    	age:55
    }
    
    obj.myFun.call(kk);	//输出结果:姓名:王五, 年龄:55
    obj.myFun.apply(kk);	//输出结果:姓名:王五, 年龄:55
    obj.myFun.bind(kk)();	//输出结果:姓名:王五, 年龄:55
    

    以上除了 bind 方法后面多了个 () 外 ,输出结果完全一致
    由此得出结论: bind 返回的是一个新的函数,你必须调用它才会被执行。

  • 对比 call(),apply(),bind() 在传参情况下的输出结果
  • 代码示例:

    var name = '张三',age = 17;
    var obj = {
    	name:'李四',
    	objAge:this.age,
    	myFun:function(hight,weight){
    		console.log('姓名:' + this.name + ', 年龄:' + this.age + ', 身高:' + hight + ', 体重:' + weight);
    	}
    }
    var kk = {
    	name:'王五',
    	age:55
    }
    
    obj.myFun.call(kk,183,90);	//输出结果:姓名:王五, 年龄:55, 身高:183, 体重:90
    obj.myFun.apply(kk,[183,90]);	//输出结果:姓名:王五, 年龄:55, 身高:183, 体重:90
    obj.myFun.bind(kk,183,90)();	//输出结果:姓名:王五, 年龄:55, 身高:183, 体重:90
    obj.myFun.bind(kk,[183,90])();	//输出结果:姓名:王五, 年龄:55, 身高:183,90, 体重:undefined
    

    只有微妙的差距

    从上面四个结果不难看出:

    call(),apply(),bind() 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:
    call() 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.myFun.call(kk,’特长’, … ,’string’ )。
    apply() 的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(kk,[‘爱好’, …, ‘string’ ])。
    bind() 除了返回是函数以外,它的参数和 call() 一样。
    当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等

    风影OvO

    风影OvO, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA 4.0协议进行授权 | 转载请注明原文链接

    留下你的评论

    *评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

    相关推荐