Posted in Javascript onMarch 08, 2007
今天有个哥们问我要是JavaScript函数重名了会有什么后果?开始我没有细想,就说可能会出错吧,可是等我实验完了发现页面没有任何脚本错误提示,而且程序也运行了,只是对同名函数的调用执行了位置靠后的一个。
回头仔细一想,这个结果完全可以接受,因为脚本在页面里本身就是顺序执行下来的,包括函数的定义,但然如果只是定义 function foo(){} 这种形式,我们是跟踪不到函数初始化的。可是如果是定义类的方式,我们就可以明显地跟踪到函数的初始化顺序。比如:
function foo() {}
function foo.prototype.fn1() {}
function foo.prototype.fn2() {}
function foo.prototype.fn1() {}
function foo.prototype.fn2() {}
我们就可以明显地看到先执行function foo.prototype.fn1(){}再执行function foo.prototype.fn2(){}。
回到我们刚才说的JavaScript脚本函数重名问题上来,比如我们定义两个函数 funAlert():
function funAlert()
{
alert('A');
}
function funAlert()
{
alert('B');
}
{
alert('A');
}
function funAlert()
{
alert('B');
}
调用 funAlert(),那么将显示一个MegBox,内容为'B'。
为什么初始化函数会有这样的效果?这里只用把上面两个函数的定义改一下,就会一目了然了,我们把定义改为:
var fnAlert = new Function("alert('A')");
var fnAlert = new Function("alert('B')");
window.fnAlert();
var fnAlert = new Function("alert('B')");
window.fnAlert();
var i = 0;
var i = 1;
var i = 1;
if ( true )
{
t = 100;
}
alert(t);
{
t = 100;
}
alert(t);
将显示100,而
if ( true )
{
var t = 100;
}
alert(t);
{
var t = 100;
}
alert(t);
也是显示100。
所以JavaScript的脚本函数名重不重复只是一个运算的问题,和我们高级语言里的语法约束完全不是一回事,当然也更不是overload的范畴。
脚本函数名重名有什么用呢?最直观就是可以用来实现伪重载,比如我们不少免费的主页空间常常会给你强加弹出窗口广告,我们就可以在页面第一行写上:
<script language="javascript">
var _open = window.open;
window.open = function() {}
</script>
var _open = window.open;
window.open = function() {}
</script>
从JavaScript的函数重名看其初始化方式
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@