在 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. 在Eclipse中tomcat 内存配置

    修改1: 在Eclipse中下面Servers双击Tomcat Server... 然后点击General InformAtion 下的Open launch configuration: 会弹出Ed ...

  2. [BZOJ2144]国家集训队 跳跳棋

    题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位置移动 ...

  3. Gradle 安装

    Gradle介绍 Gradle是一个基于JVM的构建工具,它提供了: 像Ant一样,通用灵活的构建工具 可以切换的,基于约定的构建框架 强大的多工程构建支持 基于Apache Ivy的强大的依赖管理 ...

  4. JPEG库在Linux系统下的编译和移植【转】

    本文转载自: 这篇文章介绍了jpeg库在Linux系统下的编译和移植,经过了亲自的验证,编译首先需要准备以下资源:jpegsrc.v6b.tar.gz(jpeg库),libtool-1.5.26.ta ...

  5. Magic Grid ComboBox JQuery 版

    在MagicCombo组件中嵌入Grid,以支持分页查找和跨页选取 ​ 1. ​2. [代码][JavaScript]单选示例代码     <script type="text/jav ...

  6. 小程序-demo:妹纸图

    ylbtech-小程序-demo:妹纸图 1.返回顶部 0.     1.app.js //app.js App({ onLaunch: function () { //调用API从本地缓存中获取数据 ...

  7. 关于spring MVC中获取客户端的IP地址

    1. 引入HttpServletRequest @Autowired private HttpServletRequest request; 2. 获取IP地址 private static Stri ...

  8. Jquery选择器大全、属性操作、css操作、文档、事件等

    一.简介   定义  jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库. jQuery对象  jQuery产 ...

  9. 上帝造题的七分钟2/花神游历各国/GSS4 线段树维护区间开方 By cellur925

    题目传送门 或者 另一个传送门 询问区间和都好说.但是开方?? 其实是这样的,一个数(1e9)以内连续开方6次就会变成1,于是我们就可在开方操作上进行暴力修改.暴力修改的意思其实也就是找到叶子节点进行 ...

  10. 《开源自主OdooERP部署架构指南》试读:第二章数据库服务构建

    文/开源智造联合创始人老杨 本文来自<开源自主OdooERP部署架构指南>的试读章节.书籍尚未出版,请勿转载.欢迎您反馈阅读意见. 使用apt.postgresql.org 您可以选择使用 ...