关于arguments.callee.calle…
来源:互联网 发布:湘潭软件职业技术学院 编辑:程序博客网 时间:2024/06/14 18:19
http://www.cnblogs.com/funlake/archive/2009/04/07/1431238.html
以上这篇文章写的很好,转至如下,
先从一个简单的例子说起,一个简单的button控件如下:
然后为其注册事件,这样的情况,怎么在javascript里获取event呢,特别是firefox的情况。请看:
function
}
不出意外的话,在ie/ff下,上面例子都将输出INPUT,即是触发click事件节点的标签名,ie的event获取这里就不说了,重点说说ff下的情况。
这里的arguments.callee.caller.arguments[0]看起来又长又怪,为什么在firefox的情况下,这个东西就是event呢?
首先得了解arguments.callee是什么东西,caller又是什么样的属性?
argments.callee就是函数体本身,arguments.callee.caller就是函数体的调用函数体
简单例子如下:
function
}
}
a();
不出意外,上面的例子将输出3个true,表明当a()调用时,函数b与函数a的关系。
好,弄清楚了arguments.callee与caller,我们再把原先的例子改改,
function
}
我们把argument.callee.caller的函数体输出,看看到底在ie和ff下有何区别.
可以看到ie下输出为
}
ff下输出为
}
由此看出在html控件中直接注册事件
不同,首先ff下定义了一个与节点事件同名的函数,这里是onclick事件,所以是functiononclick,然后event作为一个参数传入,内部再执行myFunc.
所以当事件触发时,在myFunc里,argument.callee.caller就是指向functiononclick,当然,argument.callee.caller.arguments[0]即为event了.
以上为转载内容。
我使用2级注册事件来测试一下,
- <!DOCTYPE
html "-//W3C//DTDPUBLIC XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - <html
xmlns="http://www.w3.org/1999/xhtml"> - <head>
- <meta
http-equiv="Content-Type" content= "text/html;charset=gb2312" /> - <title></title>
- </head>
- <body>
-
- <input
type='button' name= 'mybtn'id= 'mybtn'/> -
- <script
type='text/javascript'> - function
myFunc(){ -
alert(arguments.callee.caller.toString()) -
var ev = window.event || arguments.callee.caller.arguments[0] ,et = ev.srcElement || ev.target; - }
-
-
- function
myFunc2( e ){ -
alert(e); -
alert(arguments[0]); - }
-
- function
a(){ -
b(); - }
-
- function
b(){ -
alert(b === arguments.callee) -
alert(b.caller === a) -
alert(arguments.callee.caller === a) - }
-
-
- function
addEventHandler(oTarget, sEventType, fnHandler) { -
if (oTarget.addEventListener) { -
oTarget.addEventListener(sEventType, fnHandler, false); -
} else if (oTarget.attachEvent) { -
oTarget.attachEvent("on" + sEventType, fnHandler); -
} else { -
oTarget["on" + sEventType] = fnHandler; -
} - };
-
-
- var
BindAsEventListener_t function(object,= fun) { -
var args = Array.prototype.slice.call(arguments).slice(2); -
return function() { -
return fun.apply(object, [arguments[0] || window.event].concat(args)); -
} - }
-
- addEventHandler(
document.getElementByIdx_x("mybtn") , "click", //1myFunc ); -
- //addEventHandler(
document.getElementByIdx_x("mybtn") , "click" , myFunc2); //2 - //myFunc2();
- </script>
- </body>
- </html>
- 关于arguments.callee.calle…
- arguments&&callee
- Arguments.callee
- arguments.callee
- arguments.callee
- arguments.callee
- arguments.callee()
- arguments.callee
- arguments.callee
- arguments.callee
- arguments.callee
- arguments和arguments.callee
- js的call,callee,calle,apply
- javascript的call,callee,calle,apply
- js arguments.callee.caller.…
- javascript中关于arguments与callee的理解
- 关于js的隐含参数(arguments,callee,caller)
- 关于this、arguments、caller、callee、prototype、__proto__、length
- document.body.scrollTop用…
- JavaScript 正则表达式05
- Java GUI 菜单栏
- 如何升级Windows 10中内置的Ubuntu子系统
- 弹出层总结 和 &n…
- 关于arguments.callee.calle…
- js无缝滚动原理及详解
- css3 属性 transition
- 在python2.7.X中怎么安装numpy scipymatplotlib pandas等模块
- JavaScript qq窗口抖动效果
- css 实现的简单的图片…
- centos mariadb galera 多主同步 haprox keepalive 集群热备
- 使用MFC对FTP文件或者文件夹进行下载、断点续传等功能的个人理解
- JavaScript 之 onkeydown 事件