js中的bind、apply、call、callee、caller的区别
1、bind、apply与call的区别与使用
相同点:2者是函数原型的一个方法,因此调用者都必须是函数,第1个参数都是对象。作用是,用另一个对象替换当前对象,另一对象也即是你传的第一个参数。通常用于改变调用的函数中this的指向。如果不传对象或者传入的为null,那么默认对象就是window。bind方法是函数的方法,也是改变this的指向,返回新的函数。
不同点:第2个参数,为调用的函数的参数,区别是apply要求所有函数的参数放在一个数组中传递。
使用方法:
fun.bind(thisArg[,arg1[,arg2[,...]]])
fun.call(thisArg[, arg1[, arg2[, …]]]) fun.apply(thisArg, [arg1,arg2,…argN])
fun.call(this, arg1,arg2,arg3) == fun.apply(this, arguments) == this.fun(arg1, arg2, arg3)
var name = 'window-name';
function func() {
console.log(this.name);
}
func();
var obj = {
name: 'obj-name'
}
var f = func.bind(obj);
func();
f();

<script type="text/javascript">
function func(arg1, arg2) {
console.log(this)
if (arg1!=undefined) {
console.log(arg1);
}
if (arg2!=undefined) {
console.log(arg2);
}
}
var obj = { name: "dsfsd" }
console.log('-------apply的使用------- start');
func.apply();
func.apply(null);
func.apply(obj, ["apply-arg1", "apply-arg2"]);
console.log('-------apply的使用------- end');
console.log('-------call的使用------- start');
func.call()
func.call(null);
func.call(obj, "call-arg1", "call-arg2");
console.log('-------call的使用------- end');
</script>
运行效果:

2、callee
首先要介绍下arguments对象,他只能在js函数内部使用,是一个特殊对象,类似数组但又不是数组。使用索引方式可以获取到函数的参数值。而callee就是arguments对象的一个属性,作用是返回当前的Function对象,也即是当前的函数,因此在递归函数中经常会看到这种使用方式arguments.callee,后面可以加上函数的参数。
这样就死循环了。
function func(arg1) {
console.log(arguments.callee);
console.log(arguments.callee(10));
}
func(10);
3、caller
字面意思理解是当前函数的调用者,也即是谁调用了当前函数就返谁。返回当前函数的调用者,如果函数是顶层调用返回null。使用方法是:函数名.caller,后面也可以跟上函数的参数。
function func(arg1) {
console.log(func.caller);
func.caller(123456);
}
function func2(arg1) {
if (arg1!=undefined) {
console.log(arg1);
console.log(func2.caller);
} else {
console.log(func2.caller);
func();
}
}
func2();
第1次执行func2是顶层调用返回null。接着执行func,打印出func的调用者func2,接着执行func2(有参数),打印出参数值和func2的调用者func函数。

js中的bind、apply、call、callee、caller的区别的更多相关文章
- js中的bind方法的实现方法
js中目前我遇见的改变作用域的5中方法:call, apply, eval, with, bind. var obj = { color: 'green' } function demo () { c ...
- js中call和apply的实现原理
js中call和apply的实现原理 实现call的思路: /* 还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法 (我门可 ...
- jQuery中的.bind()、.live()和.delegate()之间区别分析
jQuery中的.bind()..live()和.delegate()之间区别分析,学习jquery的朋友可以参考下. DOM树 首先,可视化一个HMTL文档的DOM树是很有帮助的.一个简单的 ...
- js中的text(),html() ,val()的区别
js中的text(),html() ,val()的区别 text(),html() ,val()三个方法用于html元素的存值和取值,但是他们各有特点,text()用于html元素文本内容的存取,ht ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
- js中call、apply、bind那些事
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- js中call、apply和bind的区别
在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢.在说区别之前还是先总结一下三者的相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对 ...
- js中的call,apply,bind区别
在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...
- js中call、apply、bind那些事2
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如… 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- js中call、apply和bind到底有什么区别?
介绍 在js中,每个函数的原型都指向Function.prototype对象(js基于原型链的继承).因此,每个函数都会有apply,call,和bind方法,这些方法继承于Function. 它们的 ...
随机推荐
- 用rsync备份一台linux服务器上的数据
rsync是安装完linux后都会自带的,在机器上运行rsync命令看是否有安装即可 备份到远程服务器 这里介绍的rsync的用途是备份一台linux服务器上的数据到另外一台机器 环境 将需要备份机器 ...
- day02-业务服务监控
提供大量第三方工具,可以开发企业级服务监控平台,本章涉及文件与目录差异对比.HTTP质量监控.邮件告警等内容一.文件内容差异比对1.示例1 d = difflib.Differ() diff = d. ...
- ESP定律脱壳——NsPack3.x脱壳
首先进行查壳,NsPack 将程序拖入x64dbg 程序入口处标志性的push F8单步,发现仅有esp寄存器有变化 在esp上右键,在内存窗口查看,下硬件断点 F9运行程序,程序断在pop之后. 使 ...
- 面试官:就问个Spring容器初始化和Bean对象的创建,你讲一小时了
前言 spring作为一个容器,可以管理对象的生命周期.对象与对象之间的依赖关系.可以通过配置文件,来定义对象,以及设置其与其他对象的依赖关系. main测试类 public static void ...
- 如何合理的安排Folx的下载任务
搭配使用Folx专业版的智能速控与任务计划功能,用户可以实现更加自动化.智能化的下载功能.通过使用任务计划功能,用户以时间表的方式安排Folx的下载任务:而智能速控的功能又能确保用户在下载的同时,有足 ...
- FL Studio采样器设置的功能是什么
FL Studio是一款很集成化的软件,它和很多其他的软件不同,FL Studio的通道中集成了很多采样器.这种整合的方式不但功能强大而且也很便捷.今天小编就来为大家详细的简介下FL Studio采样 ...
- 【ES6】ES6入门笔记
1.概要 - ECMAScript2015(ES6)是Javascript最标准的语法式样,是在2015年6月由Ecma国籍组织公布的最新版本,现在已经被多个领域和浏览器所广泛采纳和使用. 2.学习网 ...
- 宝塔Linux面板安装
宝塔linux6.0版本是基于centos7开发的,务必使用centos7.x 系统 提示:Centos官方已宣布在2020年停止对Centos6的维护更新,各大软件开发商也逐渐停止对Centos6的 ...
- JDK阅读之Enum
JDK学习之Enum enum的使用 在没有enum之前如果想要定义一些常量,就会采用如下的方式 假设要定义四个常量表示不同的季节 public class SeasonWithoutEnum { p ...
- c++11-17 模板核心知识(十一)—— 编写泛型库需要的基本技术
Callables 函数对象 Function Objects 处理成员函数及额外的参数 std::invoke<>() 统一包装 泛型库的其他基本技术 Type Traits std:: ...