caller用法总计
分类:pc28.am

多年来读书javascript,遇到caller和callee的难点,去网络百度了数不清。搜到的内容衡水小益,整理总括了风流倜傥晃与我们分享。

Arguments : 

该对象表示正在奉行的函数和调用它的函数的参数。

[function.]arguments[n] 参数function :选项。当前正值推行的 Function 对象的名字。 
n :选项, 要传递给 Function 对象的从0开首的参数值索引。 
表达Arguments :是进展函数调用时,除了内定的参数外,还别的创立的三个隐蔽对象。Arguments是多个好像数组但不是数组的靶子,说它就如数组是因为其具备数组相像的拜候性质及方法,能够由arguments[n]来拜望对应的单个参数的值,并有着数老总度属性length。还恐怕有正是arguments对象存款和储蓄的是实际上传递给函数的参数,而不囿于于函数注明所定义的参数列表,并且无法显式创建arguments 对象。arguments 对象唯有函数开始时才可用。下面例子详细表达了这几个性质://arguments 对象的用法。 

在这里增加了四个验证arguments不是数组(Array类卡塔尔(英语:State of Qatar)的代码:
//arguments 对象的用法。

 1         function ArgTest(a, b){
 2             var i, s = "The ArgTest function expected ";
 3             var numargs = arguments.length;      // 获取被传递参数的数值。
 4             var expargs = ArgTest.length;        // 获取期望参数的数值。
 5             if (expargs < 2)
 6                s  = expargs   " argument. ";
 7             else
 8                s  = expargs   " arguments. ";
 9             if (numargs < 2)
10                s  = numargs   " was passed.";
11             else
12                s  = numargs   " were passed.";
13             s  = "nn";
14             for (i =0 ; i < numargs; i  ){       // 获取参数内容。
15             s  = "   Arg "   i   " = "   arguments[i]   "n";
16             }
17             return(s);                           // 返回参数列表。
18         }
19         ArgTest(123,456,789);

在这加多了贰个验证arguments不是数组(Array类卡塔尔(قطر‎的代码:

1         Array.prototype.selfvalue = 1;
2         alert(new Array().selfvalue);
3         function testAguments(){
4              alert(arguments.selfvalue);
5         }

运维代码你会开采第多个alert展现1,那代表数组对象具备selfvalue属性,值为1,而当您调用函数testAguments时,你会发觉展现的是“undefined”,表明了不是arguments的性质,即arguments并非三个数组对象。

caller:

回到二个对调用function函数的函数的引用(用法:function.caller)

说明:对于函数来讲,caller属性独有在函数推行时才有定义。即使函数由顶层调用,caller则为null。

 1 var time = 3 //控制次数,去掉会一直在caller与handleCaller交替不断执行
 2 function caller() {
 3     caller.caller()//返回调用caller函数的函数引用
 4 }
 5 function handleCaller() {
 6     if (time > 0){
 7         time--
 8         alert(handleCaller.caller)//返回调用handleCaller函数的函数引用
 9         alert(caller.caller)//返回调用caller函数的函数引用
10         caller()
11     }
12 }
13 handleCaller()

事例分析:先是次handleCaller运营的时候,七个alert重返的都以null,alert(handleCaller.caller卡塔尔再次来到null是因为它是由顶层调用, alert(caller.caller卡塔尔(قطر‎再次来到null是因为caller的私下认可值是null。接下去caller(卡塔尔国函数被调用,caller.caller重回的是调用它的函数(handleCaller卡塔尔(英语:State of Qatar)的引用,通过caller.caller(卡塔尔(英语:State of Qatar)能够再度调用handleCaller函数。第三遍handleCaller运营的时候,alert(handleCaller.caller卡塔尔(قطر‎再次来到的是caller代码(其实便是caller的征引),alert(caller.caller卡塔尔(英语:State of Qatar)再次来到的是handleCaller代码。因为函数之间的调用关系是handleCaller->caller->handleCaller。之后就连发在2个函数之间改换实施。

callee:

回去相对应的arguments的函数援用。(多用于无名氏函数递归卡塔尔

说明:也许你在互连网见到最多的是callee再次回到正在实践的函数援用。笔者是那般清楚,各类函数都有四个和睦的arguments,常常是用来存放在参数的。arguments有一个callee 属性,开首值正是对应自己的函数援用。当你函数实践到该语句时,arguments是暗中认可对应的是您以往进行的函数,那么arguments.callee为最近正值试行的函数的引用。当然要是你有暗号过别的函数的arguments(例子中的args),自然可以用args.callee(卡塔尔(英语:State of Qatar)去重新调用那叁个函数。

 1 function a(){
 2     alert(arguments.callee)
 3     var args = arguments
 4     function c(){
 5         alert(arguments.callee)
 6         args.callee()
 7     }
 8     c()
 9 }
10 a()

 事例深入分析:事例中的arguments.callee都是私下认可重临当前正在实施的函数的引用(a中再次回到a本身函数引用,c中重回c自己函数援引卡塔尔,而透过用args贮存a函数的arguments,在存放函数c中接受args.callee(卡塔尔再一次调用a函数。

call 方法
请参阅
应用于:Function 对象
要求
版本 5.5
调用三个目的的叁个方法,以另三个对象替换当前指标。

关键字:arguments,callee,caller
arguments:表示传入函数的参数
callee:表示函数和函数主体的语句
caller:表示调用该函数的函数

caller:重临叁个对调用function函数的函数的引用

apply and call  :

它们的效率都以将函数绑定到此外四个指标上去运转,两个仅在概念参数格局有所分裂:

    apply( thisArg , argArray );  call( thisArg[,arg1,arg2…] ] );

    即怀有函数内部的this指针都会被赋值为 thisArg,那可落成将函数作为别的叁个指标的形式运营的目标

    apply的说明:假定 argArray 不是贰个低价的数组也许不是 arguments 对象,那么将产生三个 TypeError。如果未有提供 argArray 和 thisArg任何二个参数,那么 Global 对象将被当作thisArg, 而且非常的小概被传送任何参数。 

    call的说明 :call 方法可将多个函数的指标上下文从起先的上下文修正为由 thisArg钦定的新指标。若无提供 thisArg参数,那么 Global 对象被当作thisArg

    相关技巧:

         应用call和apply还应该有一个技巧在中间,正是用 call 和 apply 应用另一个函数(类)将来,当前的函数(类)就具备了另贰个函数(类)的点子照旧是性质,那也足以称为"继承"

 1     // 继承的演示
 2    function base() {
 3         this.member = " dnnsun_Member";
 4         this.method = function() {
 5             window.alert(this.member);
 6         }
 7    }
 8    function extend() {
 9         base.call(this);
10         window.alert(member);
11         window.alert(this.method);
12    }

 上边的事例可以看出,通过call之后,extend能够继续到base的不二秘技和本性。 

call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被看作当前目的的靶子。
arg1, arg2, , argN
可选项。将被传送情势参数种类。
说明
call 方法能够用来代表另两个指标调用一个措施。call 方法可将三个函数的指标上下文从伊始的上下文字修改变为由 thisObj 钦命的新目的。

arguments

评释:对于函数来讲,caller属性唯有在函数实行时才有定义。假诺函数由顶层调用,caller则为null。

若是未有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

该目的表示正在施行的函数和调用它的函数的参数。

var time = 3 //控制次数,去掉会一直在caller与handleCaller交替不断执行function caller//返回调用caller函数的函数引用}function handleCaller{ time-- alert//返回调用handleCaller函数的函数引用 alert//返回调用caller函数的函数引用 caller

caller

事例分析:第二回handleCaller运营的时候,四个alert再次回到的都是null,alert重临null是因为它是由顶层调用, alert重临null是因为caller的暗许值是null。接下去caller(卡塔尔(قطر‎函数被调用,caller.caller重返的是调用它的函数的援引,通过caller.caller(卡塔尔(قطر‎可以重新调用handleCaller函数。第二回handleCaller运营的时候,alert重返的是caller代码,alert再次来到的是handleCaller代码。因为函数之间的调用关系是handleCaller->caller->handleCaller。之后就声音在耳边不断鸣响在2个函数之间交替实行。

乍意气风发看,超级轻巧把人看迷胡,先做一些概括的认证
obj1.method1.call(obj2,argument1,argument2)
如上,call的作用正是把obj1的点子放到obj2上运用,后边的argument1..那一个做为参数传入.

回到二个对函数的引用,该函数调用了现阶段函数。
functionName.caller
functionName 对象是所实施函数的名号。

caller指向调用当前函数的函数,然而有一点点,假如是在全局功用域内被调用,则赶回null。代码走起

举叁个具体的例子
function add(a,b)
{
alert(a b);
}
function sub(a,b)
{
alert(a-b);
}

说明
对此函数来讲,caller属性独有在函数奉行时才有定义。若是函数是由顶层调用的,那么 caller包涵的正是 null 。假诺在字符串上下文中使用 caller 属性,那么结果和functionName.toString同样,也便是说,展现的是函数的反编写翻译文本。

====================function testCaller(){if(testCaller.caller == null){console.log;}else{console.log('accessed at '   testCaller.caller);}}

testCaller(); // accessed at global

function a; // accessed at function a;} 

add.call(sub,3,1);

callee

此刻,testCaller.caller指向就是 function a

其大器晚成例子中的意思就是用 add 来替换 sub,add.call(sub,3,1卡塔尔 == add(3,1卡塔尔(قطر‎,所以运行结果为:alert(4卡塔尔; // 注意:js 中的函数其实是目的,函数名是对 Function 对象的援用。

回去正被施行的 Function 对象,也正是所钦赐的Function 对象的正文。

callee:再次来到相呼应的arguments的函数援引。

看二个略带复杂一点的事例

[function.]arguments.callee

证实:大概你在英特网见到最多的是callee重返正在施行的函数引用。作者是那样领悟,各个函数皆有二个和睦的arguments,平常是用来贮存在参数的。arguments有四个callee 属性,开首值就是对应自己的函数援用。当您函数推行到该语句时,arguments是暗许对应的是你今后实施的函数,那么arguments.callee为眼下正值进行的函数的引用。当然假使您有号子过此外函数的arguments,自然能够用args.callee(卡塔尔(قطر‎去重新调用那多少个函数。

function Class1()
{
this.name = "class1";

可选项 function 参数是近些日子正值实践的 Function 对象的名号。

function a(){ alert var args = arguments function c(){ alert args.callee

this.showNam = function()
{
alert(this.name);
}
}

说明

事例深入分析:例子中的arguments.callee都以暗许重回当前正值施行的函数的引用(a中再次回到a自己函数引用,c中重临c自己函数引用卡塔尔国,而经过用args寄存a函数的arguments,在放置函数c中央银行使args.callee(卡塔尔国再度调用a函数。

function Class2()
{
this.name = "class2";
}

callee 属性的早先值正是正被推行的 Function 对象。

====================function areturn x;elsereturn x   a // 78

var c1 = new Class1();
var c2 = new Class2();

callee 属性是 arguments对象的叁个成员,它表示对函数对象自己的引用,那有助于无名氏函数的递归可能保证函数的封装性,举例上边示例的递合併结1到n的自然数之和。而该属性仅当有关函数正在进行时才可用。还大概有要求在意的是callee具备length属性,那些性子有的时候候用于证明依旧比较好的。arguments.length是实参长度,arguments.callee.length是形参长度,因而能够判明调用时形参长度是还是不是和实参长度后生可畏致。

那是一个极简的递归,运营结果不奇怪。

c1.showNam.call(c2);

复制代码 代码如下:

var b = a;a = null; // 将a回收b; // erro : 'a' is not a function

细心,call 的意味是把 c1 的方法放到c2上实施,原本c2是向来不showNam(卡塔尔(英语:State of Qatar)方法,现在是把c1 的showNam(卡塔尔国方法放到 c2 上来举行,所以this.name 应该是 class2,实行的结果正是 :alert("class2");

<script type='text/javascript'>
function test(x,y,z)
{
alert("实参长度:" arguments.length卡塔尔(قطر‎;
alert("形参长度:" arguments.callee.length卡塔尔;
alert("形参长度:" test.length卡塔尔国;
alert(arguments[ 0 ])        
alert(test[ 0 ]卡塔尔(英语:State of Qatar)           // undefined 没有这种用法

缘由也简要,b=a,b=function a(卡塔尔{};在b调用以前,大家用了a=null。所以在 function a 运转的时候,在那之中的return x a;中的a,指向的就是null,并不是function a。所以就报错了,怎么样缓和那样的难点。大家将a换意气风发种写法

如何,感到有趣了啊,能够让a对象来试行b对象的不二等秘书诀,那是java程序猿所不敢想的。还会有更风趣的,能够用 call 来促成一连

}

function areturn x;elsereturn arguments.callee; // 这句是改变的地方}

var b = a;a = null;b; // 78

function Class1()
{
this.showTxt = function(txt)
{
alert(txt);
}
}

//test(1,2,3);
test(1,2,3,4);

缘由:尽管大家将a=null了,不过函数a中并未有用到a,而是经过arguments.callee指向当前函数。因为arguments.callee的定义正是:再次回到正在实施的函数。

function Class2()
{
Class1.call(this);
}

/*
*  arguments不是数组(Array类卡塔尔(قطر‎
*/
Array.prototype.selfvalue  =   1 ;
function  testAguments() {
    alert( " arguments.selfvalue= " arguments.selfvalue);
}
alert("Array.sefvalue=" new Array().selfvalue);
testAguments();

var c2 = new Class2();

/**/ /*
 * 演示函数的caller属性.
 * 表达:(当前函数卡塔尔国.caller:重临多个对函数的援用,该函数调用了现阶段函数
  */

c2.showTxt("cc");

function  callerDemo()  {
     if  (callerDemo.caller)  {
         var  a =  callerDemo.caller.arguments[ 0 ];
        alert(a);
    }   else   {
        alert( " this is a top function " );
    }
}
function  handleCaller()  {
    callerDemo();
}

如此那般 Class2 就世袭Class1了,Class1.call(this卡塔尔国 的 意思正是选拔 Class1 对象代替this对象,那么 Class2 中不就有Class1 的具有属性和方法了吗,c2 对象就可以预知一贯调用Class1 的办法甚至质量了,实行结果就是:alert(“cc”);

 callerDemo();
 handleCaller("参数1","参数2");

对的,便是这般,那正是 javaScript 如何来效仿面向对象中的世袭的,仍是可以够兑现多种世袭。

/**/ /*
 * 演示函数的callee属性.
 * 表明:arguments.callee:开始值就是正被施行的 Function 对象,用于无名函数
  */
function  calleeDemo()  {
    alert(arguments.callee);
}
 calleeDemo();
 (function(arg0,arg1卡塔尔(英语:State of Qatar){alert("形数数目为:" arguments.callee.length卡塔尔}卡塔尔(英语:State of Qatar)(卡塔尔国;

function Class10()
{
this.showSub = function(a,b)
{
alert(a-b);
}
}

/**/ /*
 * 演示apply,call函数的用法
 * 表明:成效都以将函数绑定到其它四个对象上去运营,两个仅在概念参数方式有所区别:
 *       apply(thisArg,argArray);
 *     call(thisArg[,arg1,arg2…] ]);
 *     即全体函数内部的this指针都会被赋值为thisArg
  */

function Class11()
{
this.showAdd = function(a,b)
{
alert(a b);
}
}

  function  ObjectA() {
    alert( " 执行ObjectA() " );
    alert(arguments[ 0 ]);
     this .hit = function (msg) {alert(msg)}
     this .info = " 我来自ObjectA "
 }

function Class2()
{
Class10.call(this);
Class11.call(this);
}

  function  ObjectB() {
    alert( " 执行ObjectB() " );
     // 调用ObjectA(卡塔尔国方法,同不常候ObjectA布局函数中的全部this就能够被ObjectB中的this代替
    ObjectA.apply( this ,arguments); // ObjectA.call(this);
    alert( this .info);
 }
  ObjectB('参数0');

一点也不细略,使用三个 call 就完成多重世袭了
理当如此,js的继续还恐怕有任何措施,比方使用原型链,那个不归于本文的层面,只是在那表明call 的用法
说了call ,当然还会有 apply,那四个措施繁多是叁个意味
区分在于 call 的第三个参数能够是随便档案的次序,而apply的第三个参数必得是数组,也能够是arguments
还会有 callee,caller,这几个和call的 用法就差别了,放到下一次讲吧 ,呵呵。
caller
回到三个对函数的引用,该函数调用了脚下函数。
functionName.caller
functionName 对象是所实行函数的名目。
说明
对此函数来讲,caller 属性独有在函数施行时才有定义。若是函数是由顶层调用的,那么 caller 包蕴的正是 null 。假如在字符串上下文中使用 caller 属性,那么结果和 functionName.toString 相通,也正是说,展现的是函数的反编写翻译文本。
下边的例子表达了 caller 属性的用法:

  var  value = " global 变量 " ;
  function  Obj() {
     this .value = " 对象! " ;
 }
  function  Fun1() {
    alert( this .value);
 }
   Fun1();
   Fun1.apply(window);
   Fun1.apply(new Obj());

// caller demo {
function callerDemo() {
if (callerDemo.caller) {
var a= callerDemo.caller.toString();
alert(a);
} else {
alert("this is a top function");
}
}
function handleCaller() {
callerDemo();
}
callee

</script>

回去正被实行的 Function 对象,也正是所内定的 Function 对象的正文。
[function.]arguments.callee
可选项 function 参数是目前正在推行的 Function 对象的称号。
说明
callee 属性的初步值正是正被奉行的 Function 对象。
callee 属性是 arguments 对象的叁个分子,它意味着对函数对象自己的援引,那便于匿名
函数的递归恐怕保障函数的封装性,比如下面示例的递合并结1到n的自然数之和。而该属性
仅当有关函数正在施行时才可用。还会有须求在乎的是callee具有length属性,那些性子不经常候
用以注脚依旧相比好的。arguments.length是实参长度,arguments.callee.length是
形参长度,因而能够判别调用时形参长度是或不是和实参长度黄金时代致。
示例
比较经常的递归函数:调用时:alert(sum(100卡塔尔卡塔尔国;
里面函数内部含有了对sum本人的援引,函数名单纯是二个变量名,在函数内部调用sum即也便是调用
一个全局变量,不可能很好的呈现出是调用笔者,这个时候使用callee会是三个比较好的方式。
//callee能够打字与印刷其自己
function calleeDemo() {
alert(arguments.callee);
}
//用于注明参数
function calleeLengthDemo(arg1, arg2) {
if (arguments.length==arguments.callee.length) {
window.alert("验证形参和实参长度正确!"卡塔尔(英语:State of Qatar);
return;
} else {
alert("实参长度:" arguments.length卡塔尔国;
alert("形参长度: " arguments.callee.length卡塔尔(قطر‎;
}
}
//递归计算
var sum = function(n){
if (n <= 0)
return 1;
else
return n +arguments.callee(n - 1)
}

arguments:表示传入函数的参数 callee:表示函数和函数主体的说话 caller:表示调用该函数的函数 arguments 该目标表示正...

var sum = function(n){
if (1==n) return 1;
else return n sum (n-1);

方法 请参阅 应用于:Function 对象 须求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前目的。 call([thisObj[,arg1[, arg2[, [,.argN...

本文由pc28.am发布于pc28.am,转载请注明出处:caller用法总计

上一篇:CSS3示例及源码,jquery动态竖向 下一篇:没有了
猜你喜欢
热门排行
精彩图文