Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

caller的概念及其兼容性差异

  caller是Function实例中的对象,虽然很早以前arguments对象中也存在caller,但是后来废弃了那个属性。caller的功能从它的名字就可以猜到,是获取一个函数的调用者。正所谓无风不起浪,一个函数是不可能平白无故就运行起来的,必须要有什么地方调用它才能运行。

  如果函数A被函数B调用,那么在被调用的期间,函数A的caller就是函数B。如果一个函数不是被另一个函数调用的,caller就为null。看下面的代码就很容易理caller的基本性质。
function a(){
  return a.caller;
};
function b(){
  alert(a.caller); //null 此刻的a没被调用
  alert(a()); //函数b
  alert(a.caller); //null 此刻的a没被调用
};
alert(a());//null 是在全局中调用的,不是被某个函数调用的
b();
  caller的基本概念虽然很简单但是有一处兼容性问题。当一个函数被eval执行时,由于eval有global和local两种模式,所以执行起来会有很大的差异。下面是测试代码,由于实验结果差异太大我就不逐个浏览器截图了,会做一个表格贴出数据。 function f(){
  eval("g()");
  (1,eval)("g()");
};
function g(){
  alert(g.caller);
};
f();
方式\环境 Chrome Firefox Opera IE9+ IE8-
eval f f f f null
(1,eval) eval null f f null
  果然很纠结吧,特别是Chrome的行为诡异到不可思议。不过真正遇到eval+caller的情况不多这些东西也不用太纠结。至于(1,eval)这种用法我以后的文章会说道,这里就简单的说一下,这个用法在现代浏览器中是在全局作用域执行代码。这篇文章也就到这儿吧,内容本来就不多。本来还说说跨函数操作参数的,仔细想想在这篇文章中写不合适。所以以后再整理啦。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^