博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
apply、call、callee、caller初步了解
阅读量:6789 次
发布时间:2019-06-26

本文共 1973 字,大约阅读时间需要 6 分钟。

  在javascript中这四货通常一起出现介绍,楼主记忆力实在是太差经常忘记用法,故记此文。

apply和call

  apply和call是函数原型的一个方法,调用者的类型必须是函数。官方解释:应用某一对象的一个方法,用另一个对象替换当前对象。通常用于改变上下文的this,这点和相似。apply和call的区别:方法传递的参数不同。apply传递的是一个数组,如果木有第二个参数两者用法结果相同。

  使用方法: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)

function fn() {  console.log(this.count);}var count = 10;var obj = {count: 20};fn(); // 10fn.call(); // 10fn.call(window); // 10fn.call(null); // 10fn.call(obj); // 20fn.apply(window); // 10fn.apply(null); // 10fn.apply(obj);  // 20

  如果没有指定this或者为null,则默认指向window。

  使用apply的好处是可以直接将当前函数的arguments对象当做第二个参数传入,在对象继承等地方发挥着巨大的作用。

// 计算数组最大值var a = [1, 2, 3, 6, 5, 4, 10, 9, 8, 7];var maxn = Math.max.apply(null, a);console.log(maxn);  // 10

callee

  callee返回正被执行的Function对象,也就是所指定的Function对象的正文。arguments.length是实参长度,arguments.callee.length是形参长度。

function fn(a, b, c, d) {  console.log(arguments.length);  // 3  console.log(arguments.callee.length); // 4  console.log(fn.length); // 4  console.log(arguments.callee === fn); // true  console.log(a.callee);  // undefined}fn(1, 2, 3);

  也许是因为楼主见识少,callee的用法楼主只看到过arguments.callee的形式(或许还有更多,所以此文标题为初步了解,望路过的大大指导...),或许你会产生疑问,以上代码的arguments.callee不是完全可以用fn代替么?其实如果是个匿名函数,arguments.callee就有用武之地了:

// 打印100以内的斐波那契数列(function(a, b) {  var c = a + b;  if(c > 100) return;  console.log(c);  arguments.callee(b, c);})(-1, 1);

caller

  caller返回一个对函数的引用(返回值是个函数),该函数调用了当前函数(调用caller的函数 即下面代码中的arguments.callee)。对于函数来说,caller属性只有在函数执行时才有定义。如果函数是由 Javascript 程序的顶层调用的,那么caller返回的就是null。

function test() {  console.log(arguments.callee);  console.log(arguments.callee.caller);}function test2() {  test();}test();test2();// test() {..}// null// test() {..}// test2() {..}

  代码如上,解释似乎也可以顺理成章。首先执行test函数,arguments.callee返回函数本身(test),而该函数是顶层调用,返回null;第二次调用test2函数,arguments.callee值不变还是test,而test函数此次是在test2中调用的,所以返回test2函数。

  函数.caller,返回函数。

 

  如有错误或者改进之处欢迎留下宝贵意见~

转载地址:http://pzsgo.baihongyu.com/

你可能感兴趣的文章
网易2016研发工程师笔试题 (整理)
查看>>
A New Effect About My Plugin render
查看>>
解决页面默认文本直接的小间距
查看>>
docker-6 管理工具
查看>>
禁止百度转码
查看>>
geoserver REST使用
查看>>
03 | 数组:为什么很多编程语言中数组都从0开始编号?
查看>>
web开发之php--- mvc 模式
查看>>
RGB565 转换 BMP24
查看>>
nodeJs 操作Mysql数据库
查看>>
《大数据时代:生活、工作与思维的大变革》读书笔记
查看>>
类的综合案例——纯虚函数与抽象类( 加强对接口与多态,以及派生类构造函数的理解 )...
查看>>
郭博分析modbus主机模式
查看>>
所有iOS 设备的屏幕尺寸
查看>>
普通平衡树(treap与splay模板)
查看>>
多项式相加
查看>>
[emuch.net]MatrixComputations(7-12)
查看>>
现在有两个变量,分别是a = 3, b = 4,那么我们不用第三个变量来调换a和b的值。...
查看>>
(算是dp吧) 小茗的魔法阵 (fzu 2225)
查看>>
Js如何调用本地应用程序
查看>>