call和apply和bind的区别
2024-08-27 13:33:22
在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。
JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」。
apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组
function.apply(thisobj, args) 或者 function.apply(thisobj, args)
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>
最新文章
- git代理,windows命令行代理,linux命令行代理
- 解决postgresql -- ERROR: 42601: query has no destination for result data
- Linux学习笔记(8)Linux常用命令之网络命令
- 一个 IT 青年北漂四年的感悟
- c语言解数独
- 深度探索C++对象模型读书笔记(2)
- POJ 2777(线段树)
- java新手笔记19 抽象类
- VI一个终端编辑多个文件的命令
- 求和函数 sum详解
- -_-#【JS】isFinite
- C++笔试题库-------Coding整理
- 将默认首页设置成index.do的方法
- C# 文件下载类
- The account &#39;...&#39; is no team with ID &#39;...&#39;
- 》》初识移动端--rem
- 本地Git与Github建立关联
- 数据结构与算法之PHP递归函数
- 利用div+css实现九宫格,然后用js实现点击每个格子可以随机更改格子(div)的背景颜色
- 协程 及 libco 介绍
热门文章
- leetcode 660. Remove 9
- 黑客常用WinAPI函数整理
- jdbc 分页
- 转载:Eclipse build Android时不生成apk问题解决方法
- selenium中关于driver的小记
- python3.6 + selenium2.53.1 查询数据库并将返回的内容中每一行的内容转换成class对象
- SPOJ GSS3 线段树系列1
- JS 数据类型入门与typeof操作符
- shiro错误:Subject does not have permission [user:select]
- 数据结构 - 静态单链表的实行(C语言)