论坛首页 Web前端技术论坛

caller 仿冒,有浏览器兼容性问题!纯属探讨测试

浏览 5009 次
精华帖 (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();
 

 

   发表时间:2008-07-16  
caller非标准 Opera不支持 没了
0 请登录后投票
   发表时间:2008-07-16  
csf178 写道
caller非标准 Opera不支持 没了

根据ECMA-262 Section 10.1.8的规定⋯⋯

那用了caller就会造成兼容性问题,官方在新版里有可能增加支持么?
貌似 ECMA-262-4 要增加,不过谁知道到哪年了
0 请登录后投票
   发表时间: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];
0 请登录后投票
   发表时间:2008-07-16  
zbm2001 写道
IE/FF/safari等几大浏览器引擎都支持,

就opera不支持,最新的9.51仍然是这样。

“看似多余的丑陋的怪异的方法”这个观点不太同意,特别是基于W3C事件模型的事件对象捕捉。若不是opera也有个window.event对象,稍微复杂点的DOM事件函数还真是有点麻烦。要不然,多层函数调用获取事件对象时,每层都得对事件对象传参。

delete arguments.callee.caller;
IE就不支持,FF支持,其他的没有测试.
这个方法是我自己想出来的,因为连IE都不支持,当然只能说是:看似多余的丑陋的怪异的方法了
0 请登录后投票
   发表时间:2008-07-16  
这是另外一个浏览器实现方法的细节问题了,注意下就是了

还有,不知道你要delete它干什么?
0 请登录后投票
   发表时间:2008-07-16  
zbm2001 写道
这是另外一个浏览器实现方法的细节问题了,注意下就是了

还有,不知道你要delete它干什么?

因为caller 仿冒了,如果可以delete的话,那么真正的caller就会恢复.
这样相当于无副作用的一次传入了两caller,
至于怎么用,有什么用是应用的问题,设计考虑的是模式,应用是千变万化的.可惜不标准,不兼容.
0 请登录后投票
   发表时间:2008-07-16  
你指的是你一楼的示例里仿冒了一个caller方法属性,

你的这个实际应用,可以用其他方法实现达到一致的效果啊,没必要非得和caller掺和在一块,
看不出有必要把“可以delete”上升到加入ECMA规范的基础方法。
0 请登录后投票
   发表时间:2008-07-16  
caller并不是一个简单的属性 它的实现一般应该是一个getter 访问时沿着函数的调用栈去查函数的最后一次调用 否则函数嵌套的多次调用时caller将会出错
我想大概因为作为函数属性这种形式比较怪异(我倒觉得不如作为arguments的属性),现在的标准才抛弃了它。

所以说很难说delete对它会产生什么效果 况且没有标准规定谁也不知道caller是不是dont delete的
0 请登录后投票
   发表时间:2008-07-17  
嗯,应该是一个实时调用的getter访问,

表现上的怪异可能是有点,但如果作为arguments的属性,似乎也有不妥的地方。

现在的标准抛弃了它——这个还真不知道,csf178 能否详细点说明一下?

如果已不是标准,再讨论这个caller的价值就不大了。

还有,如果已不是标准,有什么好的代替方法获取这个caller呢……
比如像我在4#楼给出的示例。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics