在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。

JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」。

 
apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组
function.apply(thisobj, args) 或者 function.apply(thisobj, args)

1、thisobj是调用function的对象,函数体内thisobj为this,如果参数为null则使用全局对象
2、返回调用函数function的返回值

bind(): 主要作用:将函数绑定到一个对象,返回一个新函数,通过可选的指定参数,作为指定对象的方法调用该方法

语法 fun.bind(thisArg[, arg1[, arg2[, ...]]])
function.bind(A) 或者是function.bind(A, args...);

1、A要绑定在函数上的对象
2、args...要绑定在函数上的零个或者是多个函数值
3、返回一个新函数,该函数会当做A的方法调用,并向它传入args参数

bind是ES5新增的一个方法
传参和call或apply类似
不会执行对应的函数,call或apply会自动执行对应的函数
返回对函数的引用

call(): 类似apply,将函数作为指定对象的方法来调用,传递给它的是指定参数
function.call(thisobj, args.....)

1、thisobj是调用function的对象,函数体内thisobj为this,如果参数为null则使用全局对象
2、返回调用函数function的返回值

apply与call的区别:

    <script>
function print(a,b,c,d){
alert(a + b + c + d);
}
function example(a,b,c,d){
//当参数很明确,一般使用call
print.call(this,a,b,c,d);
//封装成数组
print.apply(this,[a,b,c,d])
//javascript方法本身有的arguments数组,当参数不明确的时候可以用apply结合arguments
print.apply(this,arguments)
}
example("心","想","事","成")
</script>
var func = function(arg1, arg2) {

};
就可以通过如下方式来调用:
func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2])

三者区别demo:

<script type="text/javascript">
var obj = {
num: 888,
};
var foo = {
getNum: function() {
return this.num;
}
}
console.log(foo.getNum.bind(obj)()); //
console.log(foo.getNum.call(obj)); //
console.log(foo.getNum.apply(obj)); //
//apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
//apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
//apply 、 call 、bind 三者都可以利用后续参数传参;
//bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。
</script>

call和apply和bind的区别的更多相关文章

  1. JS 中的this指向问题和call、apply、bind的区别

    this的指向问题 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window. function a(){ console.log(this); //输出函数a中的th ...

  2. this+call、apply、bind的区别与使用

    http://www.ruanyifeng.com/blog/2018/06/javascript-this.html https://segmentfault.com/a/1190000018017 ...

  3. 改变this指针的apply,call,bind的区别

    apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...

  4. js中call、apply和bind的区别

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢.在说区别之前还是先总结一下三者的相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对 ...

  5. 有关call和apply、bind的区别及this指向问题

    call和apply都是解决this指向问题的方法,唯一的区别是apply传入的参数除了其指定的this对象之外的参数是一个数组,数组中的值会作为参数按照顺序传入到this指定的对象中. bind是解 ...

  6. Javascript中call,apply,bind的区别

    一.探索call方法原理 Function.prototype.call = function(obj) { // 1.让fn中的this指向obj // eval(this.toString().r ...

  7. JS中call()和apply()以及bind()的区别

    一.方法定义: apply:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.apply(A, arguments);即A对象应用B对象的方法. call:调用一个对象的一个方法,用另一个对 ...

  8. 超容易理解的call()、apply()、bind()的区别

    call().apply().bind()是用来改变this的指向的. 一 举个例子 一个叫喵喵的猫喜欢吃鱼,一个叫汪汪的小狗喜欢啃骨头,用代码实现如下: 有一天,小狗汪汪和喵喵共进午餐的时候,汪汪说 ...

  9. apply,all,bind的区别

    这三个都是用来改变this指向的 call() 和apply()的第一个参数相同,就是指定的对象.这个对象就是该函数的执行上下文.call()和apply()的区别就在于,两者接收的参数不一样.cal ...

随机推荐

  1. Codeforces 794F. Leha and security system 线段树

    F. Leha and security system   Bankopolis, the city you already know, finally got a new bank opened! ...

  2. bzoj4593: [Shoi2015]聚变反应炉

    这道题的难点其实是在设DP方程,见过就应该会了 令f0,i表示先激发i的父亲,再激发i,把i的整棵子树都激发的最小费用 f1,i表示先激发i,再激发i的父亲,把i的整棵子树都激发的最小费用 设x,y为 ...

  3. centos7和redhat7的比特币环境搭建

    比特币版本是 bitcoin-0.12 问题1: [root@localhost bitcoin-master]# ./autogen.sh  which: no autoreconf in (/us ...

  4. VMware克隆虚拟机后网络配置

    修复克隆虚拟机文件 # vi /etc/udev/rules.d/70-persistent-net.rules # PCI device 0x8086:0x100f (e1000) SUBSYSTE ...

  5. codeforces 689D D. Friends and Subsequences(RMQ+二分)

    题目链接: D. Friends and Subsequences time limit per test 2 seconds memory limit per test 512 megabytes ...

  6. CAAnimation

    序言 CAAnimation是一个抽象类,遵循了CAMediaTiming协议和CAAction协议!我们不要直接使用CAAnimation类,而是使用其子类: CATransition:提供渐变效果 ...

  7. 四:网络--NSURLConnection基本使用

    一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.... ...

  8. apple IOS的base64编解码

    <pre style="word-wrap: break-word; white-space: pre-wrap;">/* * Copyright (c) 2003 A ...

  9. BZOJ_4459_[Jsoi2013]丢番图_数学+分解质因数

    BZOJ_4459_[Jsoi2013]丢番图_数学+分解质因数 Description 丢番图是亚历山大时期埃及著名的数学家.他是最早研究整数系数不定方程的数学家之一. 为了纪念他,这些方程一般被称 ...

  10. 461. Hamming Distance(汉明距离)

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...