下面小编就为大家带来一篇关于 JS 中的 apply,call,bind 的深入解析。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
在 Javascript 中,Function 是一种对象。Function 对象中的 this 指向决定于函数被调用的方式。使用 apply,call 与 bind 均可以改变函数对象中 this 的指向,在说区别之前还是先总结一下三者的相似之处:
1、都是用来改变函数的 this 对象的指向的。
2、第一个参数都是 this 要指向的对象。
3、都可以利用后续参数传参。
call 方法:
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
apply:
语法:apply(thisObj, 数组参数)
定义:应用某一个对象的一个方法,用另一个对象替换当前对象
说明:如果参数不是数组类型的,则会报一个 TypeError 错误。
bind:
在 EcmaScript5 中扩展了叫 bind 的方法(IE6,7,8 不支持),bind 与 call 很相似,,例如,可接受的参数都分为两部分,且第一个参数都是作为执行时函数上下文中的 this 的对象。不同点有两个:
①bind 的返回值是函数;②后面的参数的使用也有区别;
先看例子一:
- function add(a, b) {
- alert(a + b);
- }
- function sub(a, b) {
- alert(a - b);
- }
对于,call,可以这么用:
add.call(sub,3,1); 结果为 4
对于,apply,可以这么用;
add.apply(sub,[3,1]); 结果为 4
对于,bind,可以这么用:
add.bind(sub)(3,1);结果为 4
可以看到输出结果都一样,但是传参用法不一样;
再看例子二:
- function jone(name,age,work){
- this.name=name;
- this.age=age;
- this.work=work;
- this.say=function(msg){
- alert(msg+",我叫"+this.name+",我今年"+this.age+"岁,我是"+this.work)
- }
- }
- var jack={
- name:"jack",
- age:'24',
- work:"学生"
- }
- var pet=new jone();
- pet.say.apply(jack,["欢迎您"])
- console.log(this.name)
对于 call,需要这样:
pet.say.call(jack," 欢迎您!")
对于 apply,需要这样:
pet.say.apply(jack,[" 欢迎您!"])
对于 bind,需要这样:
pet.say.bind(jack," 欢迎您 ")()
此时输出 console.log(this.name),发现 this.name 为 jack,this 上下文已经发生改变了;
以上这篇关于 JS 中的 apply,call,bind 的深入解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 phperz。
来源: http://www.phperz.com/article/17/0219/266410.html