关于JS中的apply,call,bind的深入解析

 更新时间:2016年04月05日 16:42:28   投稿:jingxian  
下面小编就为大家带来一篇关于JS中的apply,call,bind的深入解析。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

在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的深入解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • js 日期转换成中文格式的函数

    js 日期转换成中文格式的函数

    最近的项目需要将日期转换成中文的格式,于是写了个小小的JS函数,使用时直接调用即可.
    2009-07-07
  • JS实现星星海特效

    JS实现星星海特效

    这篇文章主要为大家详细介绍了JS实现星星海特效特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Echarts x轴为time的用法代码示例

    Echarts x轴为time的用法代码示例

    平时项目里数据可视化展示用的大多是echarts或者highcharts,下面这篇文章主要给大家介绍了关于Echarts x轴为time用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • 使用JavaScript 定义自己的ajax函数

    使用JavaScript 定义自己的ajax函数

    这篇文章主要为大家介绍了JavaScript定义ajax函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2021-11-11
  • 微信小程序bindtap与catchtap的区别详解

    微信小程序bindtap与catchtap的区别详解

    本文主要介绍了微信小程序bindtap与catchtap的区别详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 微信小程序从服务器中获取数据的示例代码

    微信小程序从服务器中获取数据的示例代码

    要从服务器中获取数据,可以使用微信小程序提供的wx.request()方法,下面通过示例代码介绍微信小程序怎么从服务器中获取数据,感兴趣的朋友一起看看吧
    2024-03-03
  • js字符串转换成xml对象并使用技巧解读

    js字符串转换成xml对象并使用技巧解读

    在js中有方法可以将字符串转化为xml对象,感兴趣的朋友可以参考下面的代码片段,希望对你有所帮助
    2013-04-04
  • ES6新特性五:Set与Map的数据结构实例分析

    ES6新特性五:Set与Map的数据结构实例分析

    这篇文章主要介绍了ES6新特性五之Set与Map的数据结构,结合实例形式分析了ES6中Set与Map的功能、定义、属性、结构与相关使用技巧,需要的朋友可以参考下
    2017-04-04
  • js数据类型检测总结

    js数据类型检测总结

    这篇文章给大家分享了js数据类型检测的相关实例内容,有需要的朋友可以测试下。
    2018-08-08
  • BootStrap的select2既可以查询又可以输入的实现代码

    BootStrap的select2既可以查询又可以输入的实现代码

    这篇文章主要介绍了bootstrap的select2既可以查询又可以输入的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02

最新评论