javascript中callee与caller的用法和应用场景_javascript技巧

caller :
functionName.caller 返回调用者。

看看下面的函数,大家可以复制到VS中执行下

复制代码 代码如下:

function caller() {
if (caller.caller) {
alert(caller.caller.toString());
} else {
alert("函数直接执行");
}
}
function handleCaller() {
caller();
}
handleCaller();
caller();

大家会发现第一个alert会弹出调用caller函数的调用者handleCaller,而第二个alert由于没有在其他函数体内调用,所以caller为null,就执行了 alert("函数直接执行");

callee:

返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文.
callee是arguments 的一个属性成员,它表示对函数对象本身的引用,这有利于匿名

函数的递归或者保证函数的封装性。 下面一段代码先说明callee的用法,实例代码摘自网上

复制代码 代码如下:

function calleeLengthDemo(arg1, arg2) {
alert(arguments.callee.toString());
if (arguments.length == arguments.callee.length) {
window.alert("验证形参和实参长度正确!");
return;
} else {
alert("实参长度:" + arguments.length);
alert("形参长度: " + arguments.callee.length);
}
}
calleeLengthDemo(1);

第一个消息框弹出calleeLengthDemo函数本身,这说明callee就是函数本身对象的引用。callee还有个非常有用的应用就是用来判断实际参数跟行参是否一致。上面的代码第一个消息框会弹出实际参数的长度为1,形式参数也就是函数本身的参数长度为2.

应用场景:
callee的应用场景一般用于匿名函数
大家看下下面一段代码 摘自网络

复制代码 代码如下:

var fn=function(n){
if(n>0) return n+fn(n-1);
return 0;
}
alert(fn(10))

函数内部包含了对自身的引用,函数名仅仅是一个变量名,在函数内部调用即相当于调用
一个全局变量,不能很好的体现出是调用自身,这时使用callee会是一个比较好的方法

复制代码 代码如下:

var fn=(function(n){
if(n>0) return n+arguments.callee(n-1);
return 0;
})(10);
alert(fn)

这样就让代码更加简练。又防止了全局变量的污染。

caller的应用场景 主要用于察看函数本身被哪个函数调用。

时间: 2024-11-10 01:38:12

javascript中callee与caller的用法和应用场景_javascript技巧的相关文章

javascript中String类的subString()方法和slice()方法_javascript技巧

在该书2.8.4节中讲到String类中的subString()方法和slice()方法,其用法和返回结果都基本相同,如下示例: 复制代码 代码如下: var strObj = new String("hello world"); alert(strObj.slice(3)); // 输出结果:"ol world" alert(strObj.subString(3)); // 输出结果:"ol world" alert(strObj.slice(

javascript中callee与caller的区别分析

  javascript中callee与caller的区别分析 有些小伙伴可能会问caller,callee 是什么?在javascript 中有什么样的作用?那么本篇会对于此做一些基本介绍.希望能够对大家理解javascript中的callee与caller有所帮助. callee callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数 首先我们来写个阶成函数: ? 1 2 3 4 5 6 7 function chen(x){ if (x<=1) { retur

javascript中callee与caller的区别分析_javascript技巧

callee callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数 首先我们来写个阶成函数: function chen(x){ if (x<=1) { return 1; } else{ return x*chen(x-1); }; }; 从这个函数中可以看出来,用到了递归函数,要是改变了函数名,里面的函数名也要随着改变,这样很不方便所以我们用callee来试试 function chen(x){ if (x<=1) {return 1; }else{ ret

实例讲解JavaScript中call、apply、bind方法的异同_javascript技巧

以实例切入,讲解JavaScript中call,apply,bind方法,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> function MAN(name, sex, age) { this.name =

JavaScript中的new的使用方法与注意事项_javascript技巧

原文: JavaScript, We Hardly new Ya  --Douglas Crockford.    http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/ 引用 JavaScript是一门基于原型的语言,但它却拥有一个 new 操作符使得其看起来象一门经典的面对对象语言.那样也迷惑了程序员们,导致一些有问题的编程模式. 其实你永远不需要在JavaScript使用 new Object().用字面量的形式{}去

Javascript 中 null、NaN和undefined的区别总结_javascript技巧

1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 代码 复制代码 代码如下: var a1; var a2 = true; var a3 = 1; var a4 = "Hello"; var a5 = new Object(); var a6 = null; var a7 = NaN; var a8 = undefined; alert(typeof a); //显示"u

Javascript中的for in循环和hasOwnProperty结合使用_javascript技巧

与in操作符相比,for in 在循环对象的属性时也会遍历原型链,for in 不会读取不可枚举属性,如数组的length属性. 小结 当检测某个对象是否拥有某个属性时,hasOwnProperty 是唯一可以完成这一任务的方法,在 for in 循环时,建议增加 hasOwnProperty 进行判断,可以有效避免扩展本地原型而引起的错误. 与in操作符相比,for in 在循环对象的属性时也会遍历原型链,for in 不会读取不可枚举属性,如数组的length属性. 复制代码 代码如下: /

javascript中的绑定与解绑函数应用示例_javascript技巧

Mozilla中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target: 文档节点.document.window 或 XMLHttpRequest. type: 字符串,事件名称,不含"on",比如"click"."mouseover"."keydown"等. listener :实现了 EventListene

JavaScript中使用ActiveXObject操作本地文件夹的方法_javascript技巧

在Windows平台上, js可以调用很多Windows提供的ActivexObject,本文就使用js来实现文档处理, 和使用js编写ActiveX做一个简单介绍. 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head>  <t