apply、call、callee、caller初步了解
在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初步了解的更多相关文章
- JavaScript中的內定物件與函式: arguments, callee, caller, this, apply(), call()
arguments, caller, callee, this都是用在函式(function)內的特殊內定物件.而apply()及call()則是用來呼叫函式的不同作法. arguments可用來取得 ...
- javascript 中的 arguments,callee.caller,apply,call 区别
记录一下: 1.arguments是一个对象, 是函数的一个特性,只有在函数内才具有这个特性,在函数外部不用使用. 举例: function test(){ alert(typeof argume ...
- js callee,caller学习
原文地址:js callee,caller学习 /* * caller 返回一个对函数的引用,该函数调用了当前函数. * 如果函数是由顶层调用的,那么 caller包含的就是 null . * 如果在 ...
- 关于arguments.callee.caller.arguments[0]获得event的一些问题
先从一个简单的例子说起,一个简单的button控件如下: < input type ='button' name ='mybtn' id ='mybtn' onclick ='myFun ...
- arguments .length .callee caller
如果有一个函数像下面这样: function fn(){ } 那么fn这个函数下面就有一个arguments属性(你在逗我么,后面又说对象),该属性是个对象(typeof一下就知道了),然后它下面也有 ...
- js arguments.callee & caller的用法及区别
在函数内部,arguments.callee该属性是一个指针,指向拥有这个arguments对象的函数; 而函数对象的另一个属性:caller,这个属性保存着调用当前函数的函数的引用,如果是在全局作用 ...
- 理解JavaScript中的arguments,callee,caller,apply
arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n] 参数function :选项.当前正在执行的 Function 对象的名字. n : ...
- JQuery Pagenation 知识点整理——arguments,callee,caller,apply应用(20150517)(转)
arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n]参数function :选项.当前正在执行的 Function 对象的名字. n :选 ...
- 关于js的一些关键知识点(call,apply,callee, caller,clourse,prototypeChain)
可能不少学习javascript在使用call,apply,callee时会感到困惑,以下希望对于你有所帮助: 1.~~~call ,apply是函数(函数对象)的方法:callee是函数argume ...
随机推荐
- Netlog 的数据库及 LAMP 架构
Database Sharding@Netlog 详细的描述了 Netlog 数据库架构的演变过程,文章浅显易懂,非常值得学习.本文数据.图片均来自:Database Sharding at Netl ...
- 【VB超简单入门】二、知识准备
在开始编程之前,需要先熟悉一下各种操作和术语,以后学习编程才能得心应手. 首先最重要的操作当然就是-电脑的开机关机啦~(开个玩笑哈哈),必须掌握软件的安装和卸载,还有能编写批处理程序对平时的使用也是很 ...
- JavaScript中判断为整数的多种方式
之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer). JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示,和Java的d ...
- linux下对2个连通的串口读写遇到的问题
想要分析下zmodem协议,搜索发现linux下的工具lrzsz是一个包含x,y,z modem传输的工具,下载其源码,下载.它可以借助各种串行的接口进行数据传输,比如串口,socket也可以,这点描 ...
- 数据库配置文件 conf.properties
#数据库配置 #mysql hibernate.dialect =org.hibernate.dialect.MySQLDialect jdbc.driverClassName =com.mysql. ...
- web工程 所需是jar包总结
commons-beanutils-1.8.3.jar : BeanUtils主要提供了对于JavaBean进行各种操作,需要Commons -Collections包和Commons -loggin ...
- 《TCP/IP 详解 卷一》读书笔记 -----第四章 ARP
1.一个物理层的网络,例如以太网,可以同时被多个不同的网络层所使用.例如网络中的一些主机使用TCP/IP协议,其他主机使用其他的网络协议. 2.设备驱动软件从不关心IP数据报中的目的IP地址.这也是为 ...
- python中BeautifulSoup库中find函数
http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html#contents 简单的用法: find(name, at ...
- Ajax类库需要注意的问题
构建Ajax类库时,注意四步就可以了: 1:创建Ajax 对象 2:链接服务器 3:发送请求 4:返回响应 下面是我自己写的一个Ajax类库: function ajax(url,fnn,fai) ...
- uGUI练习 开篇
一.准备阶段 1.Unity 4.6 Beta b18或更高版本(注:目前泄露版的Unity5.0Beta 对UI的支持并没有4.6 Beta那么好) 2.了解 Unity 2D Sprite的基础知 ...