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函数。

 

最新文章

  1. scala case class
  2. mysql优化总结
  3. js中的cookie使用
  4. 关于字符串 “*****AB**C*D*****” 中前缀、后缀和中间 &#39;*&#39; 的处理
  5. GitHub的css/js文件给墙了的解决方法
  6. MySQL的用户密码过期功能详解
  7. profile和bash
  8. vbscript语句
  9. Java伪代码描述《大道至简》第一章
  10. 从运维的角度分析使用阿里云数据库RDS的必要性--你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库
  11. 文本相似度 — TF-IDF和BM25算法
  12. 记录一下不能使用let时如何创建局部变量(使用立即执行函数)
  13. CMS Collector and G1 Collector
  14. python安装与配置
  15. MySQL——约束(constraint)详解
  16. Python Pycharm连接Ubantu Python环境
  17. ps命令之排序
  18. failed to load selinux policy freezing
  19. Linux改变用户shell的类型
  20. HAWQ + MADlib 玩转数据挖掘之(三)——向量

热门文章

  1. vdbench测试实时可视化显示
  2. istio in kubernetes (一) --原理篇
  3. xml格式数据和数组数据互相转换
  4. beef+metasploit
  5. 移动端调试Web页面
  6. IDM下载器的自定义设置
  7. H5系列之video自己编写控制栏
  8. 洛谷 P1284 三角形牧场 题解(背包+海伦公式)
  9. ERP制造模块操作与设计--开源软件诞生30
  10. Ajax原理与图解