精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-16
首先,我不知道这个方法能怎么应用,仅仅知道这是一种无副作用的方法(虽然看似多余的丑陋的怪异的方法,),而且有浏览器兼容性问题,不知道ecma-262是如何定义caller的. function foo(s){ if (!s){ f.caller=function(s){alert('ya......'+s)}; f(); }else alert(s); } function f(){ var caller=arguments.callee.caller; delete arguments.callee.caller; arguments.callee.caller('foo'); caller('foo'); } foo();
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-07-16
caller非标准 Opera不支持 没了
|
|
返回顶楼 | |
发表时间:2008-07-16
csf178 写道 caller非标准 Opera不支持 没了
根据ECMA-262 Section 10.1.8的规定⋯⋯ 那用了caller就会造成兼容性问题,官方在新版里有可能增加支持么? 貌似 ECMA-262-4 要增加,不过谁知道到哪年了 |
|
返回顶楼 | |
发表时间:2008-07-16
IE/FF/safari等几大浏览器引擎都支持,
就opera不支持,最新的9.51仍然是这样。 “看似多余的丑陋的怪异的方法”这个观点不太同意,特别是基于W3C事件模型的事件对象捕捉。若不是opera也有个window.event对象,稍微复杂点的DOM事件函数还真是有点麻烦。要不然,多层函数调用获取事件对象时,每层都得对事件对象传参。 caller方法可以不受多层函数调用的限制,比如捕捉事件对象,类似这样: var caller=arguments.callee; while(caller.caller){ caller=caller.caller; } var event=caller.arguments[0]; |
|
返回顶楼 | |
发表时间:2008-07-16
zbm2001 写道 IE/FF/safari等几大浏览器引擎都支持,
就opera不支持,最新的9.51仍然是这样。 “看似多余的丑陋的怪异的方法”这个观点不太同意,特别是基于W3C事件模型的事件对象捕捉。若不是opera也有个window.event对象,稍微复杂点的DOM事件函数还真是有点麻烦。要不然,多层函数调用获取事件对象时,每层都得对事件对象传参。 delete arguments.callee.caller; IE就不支持,FF支持,其他的没有测试. 这个方法是我自己想出来的,因为连IE都不支持,当然只能说是:看似多余的丑陋的怪异的方法了 |
|
返回顶楼 | |
发表时间:2008-07-16
这是另外一个浏览器实现方法的细节问题了,注意下就是了
还有,不知道你要delete它干什么? |
|
返回顶楼 | |
发表时间:2008-07-16
zbm2001 写道 这是另外一个浏览器实现方法的细节问题了,注意下就是了
还有,不知道你要delete它干什么? 因为caller 仿冒了,如果可以delete的话,那么真正的caller就会恢复. 这样相当于无副作用的一次传入了两caller, 至于怎么用,有什么用是应用的问题,设计考虑的是模式,应用是千变万化的.可惜不标准,不兼容. |
|
返回顶楼 | |
发表时间:2008-07-16
你指的是你一楼的示例里仿冒了一个caller方法属性,
你的这个实际应用,可以用其他方法实现达到一致的效果啊,没必要非得和caller掺和在一块, 看不出有必要把“可以delete”上升到加入ECMA规范的基础方法。 |
|
返回顶楼 | |
发表时间:2008-07-16
caller并不是一个简单的属性 它的实现一般应该是一个getter 访问时沿着函数的调用栈去查函数的最后一次调用 否则函数嵌套的多次调用时caller将会出错
我想大概因为作为函数属性这种形式比较怪异(我倒觉得不如作为arguments的属性),现在的标准才抛弃了它。 所以说很难说delete对它会产生什么效果 况且没有标准规定谁也不知道caller是不是dont delete的 |
|
返回顶楼 | |
发表时间:2008-07-17
嗯,应该是一个实时调用的getter访问,
表现上的怪异可能是有点,但如果作为arguments的属性,似乎也有不妥的地方。 现在的标准抛弃了它——这个还真不知道,csf178 能否详细点说明一下? 如果已不是标准,再讨论这个caller的价值就不大了。 还有,如果已不是标准,有什么好的代替方法获取这个caller呢…… 比如像我在4#楼给出的示例。 |
|
返回顶楼 | |