js的call方法_apply方法_caller属性_callee属性
原文地址:http://aweber.blogbus.com/logs/46751586.html
一、call 方法
调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容)。
- call([thisObj[,arg1[,<wbr>arg2[,<wbr><wbr><wbr>[,.argN]]]]])</wbr></wbr></wbr></wbr>
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2,<wbr><wbr> , argN<br>
可选项。将被传递方法参数序列。<br>
说明<br>
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。</wbr></wbr>
- <input<wbr>type=</wbr>“text”id=“myText”value=“input<wbr>text”</wbr>>
- <script>
- functionObj(){this.value=“对象!”;}
- varvalue=“global<wbr>变量”</wbr>;
- functionFun1(){alert(this.value);}
- window.Fun1();<wbr><wbr><wbr><span>//global<wbr>变量</wbr></span></wbr></wbr></wbr>
- Fun1.call(window);<wbr><wbr><span>//global<wbr>变量</wbr></span></wbr></wbr>
- Fun1.call(document.getElementByIdx_x_x(‘myText’));//input<wbr>text</wbr>
- Fun1.call(new Obj());//对象!
- </script>
- varfirst_object<wbr>=<wbr>{</wbr></wbr>
- num:<wbr>42</wbr>
- };
- varsecond_object<wbr>=<wbr>{</wbr></wbr>
- num:<wbr>24</wbr>
- };
- functionmultiply(mult)<wbr>{</wbr>
- returnthis.num<wbr>*<wbr>mult;</wbr></wbr>
- }
- multiply.call(first_object,<wbr>5);<wbr><span>//<wbr>returns<wbr>42<wbr>*<wbr>5</wbr></wbr></wbr></wbr></span></wbr></wbr>
- multiply.call(second_object,<wbr>5);<wbr><span>//<wbr>returns<wbr>24<wbr>*<wbr>5</wbr></wbr></wbr></wbr></span></wbr></wbr>
二、apply方法
apply方法的第一个参数也是要传入给当前对象的对象,即函数内部的this。后面的参数都是传递给当前对象的参数。
对于apply和call两者在作用上是相同的,但两者在参数上有区别的。对于第一个参数意义都一样,但对第二个参数:apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入。
- var func=newfunction(){this.a=“func”}
- varmyfunc=function(x,y){
- vara=“myfunc”;
- alert(this.a);
- alert(x<wbr>+<wbr>y);</wbr></wbr>
- }
- myfunc.call(func,“var”,“<wbr>fun”</wbr>);//<wbr>”func”<wbr>”var<wbr>fun”</wbr></wbr></wbr>
- myfunc.apply(func,["var","<wbr>fun"</wbr>]);//<wbr>”func”<wbr>”var<wbr>fun”</wbr></wbr></wbr>
三、caller 属性
返回一个对函数的引用,即调用了当前函数的函数体。
functionName.caller :functionName 对象是所执行函数的名称。
说明:
对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 JScript 程序的顶层调用的,那么 caller包含的就是 null 。如果在字符串上下文中使用 caller 属性,那么结果和 functionName.toString一样,也就是说,显示的是函数的反编译文本。
- <script>
- functionCallLevel(){
- if(CallLevel.caller<wbr>==</wbr>null)
- alert(“CallLevel<wbr>was<wbr>called<wbr>from<wbr>the<wbr>top<wbr>level.”</wbr></wbr></wbr></wbr></wbr></wbr>);
- else
- alert(“CallLevel<wbr>was<wbr>called<wbr>by<wbr>another<wbr>function:\n”</wbr></wbr></wbr></wbr></wbr>+CallLevel.caller);
- }
- functionfunCaller(){
- CallLevel();
- }
- CallLevel();
- funCaller()
- </script>
四、callee属性
返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。
[function.]arguments.callee:可选项 function 参数是当前正在执行的 Function对象的名称。
说明:
callee 属性的初始值就是正被执行的 Function 对象。
callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿
函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性
仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性,这个属性有时
用于验证还是比较好的。arguments.length是实参长度,arguments.callee.length是
形参长度,由此可以判断调用时形参长度是否和实参长度一致。
- //callee可以打印其本身
- functioncalleeDemo()<wbr>{</wbr>
- alert(arguments.callee);
- }
- //用于验证参数
- functioncalleeLengthDemo(arg1,<wbr>arg2)<wbr>{</wbr></wbr>
- if(arguments.length==arguments.callee.length)<wbr>{</wbr>
- window.alert(“验证形参和实参长度正确!”);
- return;
- }<wbr><span>else</span><span>{</span></wbr>
- alert(“实参长度:”+arguments.length);
- alert(“形参长度:<wbr>”</wbr>+arguments.callee.length);
- }
- }
- //递归计算
- var sum<wbr>=</wbr>function(n){
- if(n<wbr><=<wbr>0)</wbr></wbr>
- return 1;
- else
- returnn<wbr>+arguments.callee(n<wbr>-<wbr>1)</wbr></wbr></wbr>
- }
五、bind
- <script<wbr>type=</wbr>“text/javascript”>
- varfirst_object<wbr>=<wbr>{</wbr></wbr>
- num:<wbr>42</wbr>
- };
- varsecond_object<wbr>=<wbr>{</wbr></wbr>
- num:<wbr>24</wbr>
- };
- functionmultiply(mult)<wbr>{</wbr>
- returnthis.num<wbr>*<wbr>mult;</wbr></wbr>
- }
- Function.prototype.bind<wbr>=<wbr><span>function</span><span>(obj)<wbr>{</wbr></span></wbr></wbr>
- var method<wbr>=</wbr>this,
- temp<wbr>=<wbr><span>function</span><span>()<wbr>{</wbr></span></wbr></wbr>
- returnmethod.apply(obj,<wbr>arguments);</wbr>
- };
- return temp;
- }
- varfirst_multiply<wbr>=<wbr>multiply.bind(first_object);</wbr></wbr>
- first_multiply(5);<wbr><span>//<wbr>returns<wbr>42<wbr>*<wbr>5</wbr></wbr></wbr></wbr></span></wbr>
- varsecond_multiply<wbr>=<wbr>multiply.bind(second_object);</wbr></wbr>
- second_multiply(5);<wbr><span>//<wbr>returns<wbr>24<wbr>*<wbr>5</wbr></wbr></wbr></wbr></span></wbr>
- </script>
分享到:
相关推荐
理解JavaScript的caller callee call apply
NULL 博文链接:https://cuckoosnest.iteye.com/blog/470131
主要介绍了javascript中call,apply,callee,caller用法,结合实例形式分析了javascript中call,apply,callee,caller功能、使用方法及相关操作注意事项,需要的朋友可以参考下
Javascript – 全面理解 caller,callee,call,apply Author: BlueDestiny, never-online From: http://www.never-online.net, Blog.csdn.net/BlueDestiny 1、caller JScript参考中说明为:返回一个对函数的...
NULL 博文链接:https://davidxiaozhi.iteye.com/blog/1026937
理解Javascript的caller,callee,call,apply区别
js apply/call/caller/callee/bind使用方法与区别分析,需要的朋友可以参考下。
挺好的,虽然我用的是jQuery,但感觉还是有些用的~~~
在看到大家如此关注JS里头的这几个对象,我试着把原文再修改一下,力求能再详细的阐明个中意义
apply 方法 应用对象的一个方法,用当前对象代替另一对象。 arguments 属性 返回一个包含传递给当前执行函数的每个参数的数组。 Array 对象 提供对创建任何数据类型的数组的支持。 asin 方法 返回一个数的反正弦...
apply 方法 应用对象的一个方法,用当前对象代替另一对象。 arguments 属性 返回一个包含传递给当前执行函数的每个参数的数组。 Array 对象 提供对创建任何数据类型的数组的支持。 asin 方法 返回一个数的反正弦...
apply 方法 应用对象的一个方法,用当前对象代替另一对象。 arguments 属性 返回一个包含传递给当前执行函数的每个参数的数组。 Array 对象 提供对创建任何数据类型的数组的支持。 asin 方法 返回一个数的反正弦...
3.3.1、call 3.3.2、apply 3.3.3、caller 3.3.4、Callee 3.5、立即执行函数表达式 (IIFE) 3.5.1、匿名函数与匿名对象 3.5.2、函数与函数表达式 3.5.3、立即执行函数表达式与匿名对象 3.5.4、各种IIFE的写法 3.5.5、...
正则表达式 call(),apply(),callee,caller,cookie方法,setInterval(),clearInterval(),setTimeout() ,clearTimeout()
JavaScript权威指南 犀牛书 Chapter 1. Introduction to JavaScript Section 1.1. JavaScript Myths Section 1.2. Versions of JavaScript Section 1.3. Client-Side JavaScript Section 1.4. JavaScript ...
call call()、Function.call() callee arguments.callee caller arguments.caller 摄像头 Camera 类 capabilities System.capabilities 对象 CAPSLOCK Key.CAPSLOCK caption ContextMenuItem.caption ...