caller和caller属性

一、callee属性是一个指针,指向拥有这个arguments对象的函数。

为什么要有这个属性呢?我们来看一下下面这个递归函数

function factorial(num){if(num<=1){return 1;}else{return num*factorial(num-1);}}

这个函数的执行和函数名factorial紧紧耦合在了一起。
当函数名发生改变的时候,里面的factorial也要随着改变
为了消除这种紧密耦合的现象,可以像下面这样使用arguments.callee

function factorial(num){if(num<=1){return 1;}else{return num*arguments.callee(num-1);}
}

在这个重写的factorial()函数的函数体内,没有再引用函数名factorial。
这样,无论引用函数时使用的是什么名字,都可以保证正常完成递归调用。

例如:// 实际上是在另一个位置上保存了一个函数的指针var trueFactorial = factorial;factiroal = function(){return 0;}alert(trueFactorial(5))       // 120alert(factorial(0))           // 0

函数的名字仅仅是一个包含指针的变量而已。
function sayColor(){
alert(this.color);
}

o.sayColor = sayColor;
全局的sayColor()函数与o.sayColor()指向的仍然是同一个函数。

二、ECMAScript5也规范了另一个函数对象的属性:caller

这个属性中保存着调用当前函数的函数引用,如果是在全局作用域中调用当前函数,它的值为null。

 例如:function outer(){inner();}function inner(){alert(inner.caller);}outer();这是提示框中显示的是out()函数的源代码,因为outer()调用了inner(),所以inner.caller就指向outer()。

严格模式下:
访问arguments.callee会导致错误。
ECMAScript5还定义了arguments.caller属性,
严格模式下访问也会导致错误,非严格模式下这个属性始终是undefined。

严格模式下,不能为函数的caller属性赋值,否则会导致错误。

定义arguments.callee属性是为了分清arguments.caller和函数的caller属性。
获取参数的引用使用callee,获取函数的引用使用caller

JavaScript之caller和caller属性相关推荐

  1. javascript下的arguments,caller,callee,call,apply示例及理解

    在看到大家如此关注JS里头的这几个对象,我试着把原文再修改一下,力求能再详细的阐明个中意义.在提到上述的概念之 前,首先想说说javascript中函数的隐含参数:arguments Argument ...

  2. JavaScript 之arguments、caller 和 callee 介绍

    1.前言 arguments, caller ,   callee 是什么? 在javascript 中有什么样的作用?本篇会对于此做一些基本介绍. 2. arguments arguments:  ...

  3. JavaScript中callee和caller的用法解读

    1.callee: callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数. 作用:指向当前对象. 例1: <script type="text/java ...

  4. Javascript中callee和caller的作用

    Javascript中callee和caller的作用 caller 是返回⼀个对函数的引⽤,该函数调⽤了当前函数: callee 是返回正在被执⾏的 function 函数,也就是所指定的 func ...

  5. 【Infragistics教程】在javascript类中添加静态成员属性

    2019独角兽企业重金招聘Python工程师标准>>> [下载Infragistics Ultimate最新版本] 在一个javascript类中创建一个属性的需求,它需要被所有对象 ...

  6. JavaScript 中遍历对象的属性

    原文链接 JavaScript 中遍历对象的属性 参考 JavaScript中的属性:如何遍历属性 <JavaScript 高级程序设计> 概述 遍历 JavaScript 对象中的属性没 ...

  7. JavaScript 中遍历对象的属性 1

    JavaScript 中遍历对象的属性 原文链接 JavaScript 中遍历对象的属性 参考 JavaScript中的属性:如何遍历属性 <JavaScript 高级程序设计> 概述 遍 ...

  8. javascript 解决IE8 兼容 placeholder 属性 含password

    javascript 解决IE8 兼容 placeholder 属性 含password function placeholderfun(){if( !('placeholder' in docume ...

  9. JavaScript学习(八)—属性节点和属性值的操作

    JavaScript学习(八)-属性节点和属性值的操作 方式一: 利用元素节点的attributes属性来获取该元素身上所有的属性 格式1:元素节点.attributes 返回值:返回值为所有属性的节 ...

最新文章

  1. TCP 的那些事儿(下)
  2. Python 面向对象、封装
  3. LNK1136报错解决方法
  4. 补课系列:最小生成树
  5. 图像传感器与信号处理——SFR算法/ISO 12233解读
  6. 10种轻量级人脸检测算法大PK
  7. SAP Analytics Cloud里如何基于一个已有的model创建Story
  8. 【渝粤教育】电大中专就业指导作业 题库
  9. 华为acl怎么生效_华为ACL配置教程(一)
  10. 将React Native升级到最新版本的最简单方法
  11. springboot+mybatis+druid 多数据源整合
  12. msp430的常量可以这样定义
  13. 【千锋】网络安全笔记(总篇)--- 持续更新
  14. php开源桌面会议系统,开源视频会议系统 OpenMeetings
  15. 电商平台接入手机支付宝支付(服务商授权模式,可直接付款给卖家)
  16. 百度云c++语言模拟器,C++语言基础教程
  17. 【OCP】小麦苗OCP(包括11g、12c、18c、19c等)网络班早已开讲,注重实践,报名一次,终身可免费升级学习,推荐有红包...
  18. 1082 射击比赛 (20分)
  19. 数据分析入门书籍整理
  20. 为什么Vue(默认情况下)比React性能更好

热门文章

  1. Silicon单片机芯片解密
  2. java对外接口安全问题_怎么保证对外暴露接口的安全性(调用频率限制)
  3. 线性代数知识点总结——矩阵乘法、矩阵运算与性质、矩阵微积分
  4. 将vscode打造成无敌的IDE(1)初步探索vscode,解放生产力
  5. MyEclipse修改JSP模板
  6. 机器学习项目:泰坦尼克号幸存者预测
  7. matlab不规则碎片拼接,一种不规则破碎单面图像快速拼接方法
  8. 基于Java的地理位置定位系统
  9. Linux下载神器XDM,代替IDM
  10. 360浏览器html文件无图标,360浏览器在网页的右键里不显示审查元素怎么了