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

apply和call

  apply和call是函数原型的一个方法,调用者的类型必须是函数。官方解释:应用某一对象的一个方法,用另一个对象替换当前对象。通常用于改变上下文的this,这点和bind相似。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();
fn.call();
fn.call(window);
fn.call(
fn.call(obj);
fn.apply(window);
fn.apply(
fn.apply(obj);  

  如果没有指定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);  

callee

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

function fn(a, b, c, d) {
  console.log(arguments.length);
  console.log(arguments.callee.length);
  console.log(fn.length);
  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,返回函数。

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

apply、call、callee、caller初步了解的更多相关文章

  1. JavaScript中的內定物件與函式: arguments, callee, caller, this, apply(), call()

    arguments, caller, callee, this都是用在函式(function)內的特殊內定物件.而apply()及call()則是用來呼叫函式的不同作法. arguments可用來取得 ...

  2. javascript 中的 arguments,callee.caller,apply,call 区别

    记录一下: 1.arguments是一个对象, 是函数的一个特性,只有在函数内才具有这个特性,在函数外部不用使用. 举例: function test(){   alert(typeof argume ...

  3. js callee,caller学习

    原文地址:js callee,caller学习 /* * caller 返回一个对函数的引用,该函数调用了当前函数. * 如果函数是由顶层调用的,那么 caller包含的就是 null . * 如果在 ...

  4. 关于arguments.callee.caller.arguments[0]获得event的一些问题

    先从一个简单的例子说起,一个简单的button控件如下: < input  type ='button'  name ='mybtn'  id ='mybtn'  onclick ='myFun ...

  5. arguments .length .callee caller

    如果有一个函数像下面这样: function fn(){ } 那么fn这个函数下面就有一个arguments属性(你在逗我么,后面又说对象),该属性是个对象(typeof一下就知道了),然后它下面也有 ...

  6. js arguments.callee & caller的用法及区别

    在函数内部,arguments.callee该属性是一个指针,指向拥有这个arguments对象的函数; 而函数对象的另一个属性:caller,这个属性保存着调用当前函数的函数的引用,如果是在全局作用 ...

  7. 理解JavaScript中的arguments,callee,caller,apply

    arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n] 参数function :选项.当前正在执行的 Function 对象的名字. n : ...

  8. JQuery Pagenation 知识点整理——arguments,callee,caller,apply应用(20150517)(转)

    arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n]参数function :选项.当前正在执行的 Function 对象的名字. n :选 ...

  9. 关于js的一些关键知识点(call,apply,callee, caller,clourse,prototypeChain)

    可能不少学习javascript在使用call,apply,callee时会感到困惑,以下希望对于你有所帮助: 1.~~~call ,apply是函数(函数对象)的方法:callee是函数argume ...

随机推荐

  1. Java小方法

    /** * 计算百分比. * @param dividend 被除数 * @param divisor 除数 * @return 结果 */ private String getPercent(lon ...

  2. BIG biang教你误删oracle 怎么办,

    今天无意中在网上看到了关于oracle误删除数据恢复的一条信息,发现的确很好使,下面就我的测试向大家汇报下. 1. select * from t_viradsl2 t         //查询t_v ...

  3. 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发

    第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...

  4. ProjectManager Alpha8 - 项目管理器,管理起开发中的项目很方便

    话不多说= = 放几张图了: 文件下载: 32位下载:Package_ProjectManager-1.13.12.exe 64位下载:Package_ProjectManager_x64-1.13. ...

  5. 在VMware上安装CentOS-6.5 minimal - 配置网络

    CentOS的minimal版本默认不启动网络,所以安装完CentOS要自己配置网络. 老伯的VMware虚拟机网络连接方式采用NAT方式(其他方式没试过). 1 修改配置文件/etc/sysconf ...

  6. 用javascript得到客户端IP的新方法

    javascript得到客户端IP的新方法 很久以来,我都是经过http://fw.qq.com/ipaddress来得到客户端用户的IP,这个方法简单.快速.实用 . 我们调用它的写法是: < ...

  7. Android ActionBarDrawerToggle、DrawerLayout、ActionBar 结合

    ActionBarDrawerToggle是一个开关,用于打开/关闭DrawerLayout抽屉 ActionBarDrawerToggle 提供了一个方便的方式来配合DrawerLayout和Act ...

  8. Maya FEM节点框架完成

    这几天把物理模拟框架移植到maya之中了. maya编程有一点比较关键,就是要让自己的程序逻辑适应maya的节点求值机制.在物理模拟中,往往需要进行时间积分,对此我的解决办法是,写一个节点rigSim ...

  9. TIF、JPG图片手动添加地理坐标的方法(转载)

    题目:为TIF.JPG图片添加地理坐标/平面直角坐标. 图片来源:GOOGLE EARTH.(当然也可以是其他知道四角点坐标的图片) 截图工具:GEtscreen(此软件截图时可以自动生成图片四角点坐 ...

  10. openstack中彻底删除计算节点的操作记录

    在使用openstack的过程中,我们经常会添加好几台计算节点来部署虚拟机,在后续使用中由于某些原因,一些计算节点出现了问题,需要将这些出了问题的计算节点从openstack的控制节点中踢出去!但是很 ...