今天在网上看见这种调用,据说是解决火狐下事件或得问题的,var evt=window.event|arguments.callee.caller.arguments[0]
argument.callee就是函数本身,caller函数的调用函数.
<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;
}
</script>
我们把argument.callee.caller的函数体输出,看看到底在ie和ff下有何区别.
可以看到ie下输出为
function anonymous(){
myFunc()
}
ff下输出为
function onclick(event){
myFunc();
}
在html控件中直接注册事件在ie/ff下表现的不同, ie下定义了一个匿名函数,内部再执行用户定制的函数(myFunc),而ff下则有所
不同,首先ff下定义了一个与节点事件同名的函数,这里是onclick事件,所以是function onclick,然后event作为一个参数传入,内部再执行myFunc.
所以当事件触发时,在myFunc里,argument.callee.caller就是指向function onclick,当然,argument.callee.caller.arguments[0]即为event了.
分享到:
相关推荐
JavaScript中的`arguments.callee`是一个在函数内部引用当前正在执行的函数对象的属性。这个属性在函数递归、保持函数封装性以及匿名函数自我引用等场景中尤其有用。然而,由于`arguments`对象是一个相对昂贵的操作...
总的来说,虽然`arguments.callee`在过去的JavaScript开发中起到了重要作用,但随着语言的进化,开发者应逐渐适应不依赖`arguments.callee`的编程风格,充分利用ES6及更高版本提供的新特性,编写更加高效、简洁的...
JavaScript中的隐含参数`arguments`, `...然而,由于`arguments.callee`在ES5后的限制,现在更倾向于使用其他技巧如命名函数表达式、闭包或`Array.from()`等方法来实现类似的功能,以保持代码的清晰性和可维护性。
在JavaScript编程中,arguments、caller和callee是函数对象自带的三个隐含参数,它们为开发者提供了额外的函数执行信息,尤其在处理函数参数、递归调用以及调用栈追踪时非常有用。下面详细介绍这些隐含参数的使用...
在代码示例中,作者通过创建一个简单的HTML页面和JavaScript脚本,展示了如何利用console.log()函数和instanceof操作符来判断arguments对象的类型,并且还演示了如何使用arguments.callee和child.caller来获取当前...
sTemp+=arguments.callee + “\n\n”; sTemp+=”传入参数的长度:\n”; sTemp+=arguments.length+”\n\n”; sTemp+=”传入参数的内容:\n”; for (var i=0;i [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
然而,由于这种用法可能导致难以调试的代码,ES5严格模式下会禁止使用arguments.callee。 4. **apply方法** apply是Function对象的一个方法,允许改变函数调用的上下文(即this值)以及传入参数。它接受两个参数:...
if(n > 0) return n + arguments.callee(n - 1); return 0; })(10); ``` 在这个例子中,`arguments.callee`使得即使是匿名函数,也能在递归调用中正确引用自身,而不依赖外部定义的函数名。这不仅让代码更加简洁...
其次,arguments.callee属性是Arguments对象的一个独特功能,它允许在函数内部引用正在执行的函数自身。这对于实现递归调用特别有用,因为函数可以直接通过arguments.callee调用自己,而无需保存函数名称的引用。...
`arguments.length`返回的是实际传递给函数的参数数量,而`arguments.callee.length`返回的是函数定义时接受的参数数量。 ```javascript function calleeLengthDemo(arg1, arg2) { if (arguments.length == ...
console.info(arguments.callee.caller); } ``` 4. 实例:斐波那契数列 斐波那契数列可以通过递归方法实现,`callee`在这里可以用于避免重复计算。通过缓存结果,我们可以提高效率: ```javascript var result = ...
// 在旧版本浏览器中,arguments.callee会指向这个匿名函数 ``` 接下来,我们讨论`call`和`apply`,它们是JavaScript中函数调用的两种特殊方式。`call`和`apply`的主要区别在于传递参数的方式:`call`接受一个参数...
因此,在`myFunc()`内部,`arguments.callee.caller`指向`onclick`函数,而`arguments.callee.caller.arguments[0]`就是`event`对象。 总结一下,获取`event`对象的方法在不同的浏览器环境中有所不同: - Internet...
可以考虑使用`arguments.callee.caller.arguments[0]`来代替,这是因为`arguments.callee.caller`可以指向调用当前函数的上一个函数,而`caller.arguments[0]`则通常为事件对象。 ```javascript function ...
6. **`arguments.callee`和`arguments.caller`**: 在ES5及之前,`arguments.callee`引用当前执行的函数,`arguments.caller`则返回调用当前函数的函数。然而,由于这些属性可能导致性能问题和难以调试的代码,它们...
3. 访问arguments.callee或函数的caller属性将导致“类型错误(TypeError)” 4. 以下代码的执行效果与非严格模式并不一致:js