(转)从JavaScript函数重名看其初始化方式

     在项目中不小心写了两个同名函数,但参数不同,以为没有问题,其实总是执行最后个javascript函数。具体原因见下:(下面内容转载)

    今天有个哥们问我要是JavaScript函数重名了会有什么后果?开始我没有细想,就说可能会出错吧,可是等我实验完了发现页面没有任何脚本错误提示,而且程序也运行了,只是对同名函数的调用执行了位置靠后的一个。

    回头仔细一想,这个结果完全可以接受,因为脚本在页面里本身就是顺序执行下来的,包括函数的定义,但然如果只是定义 function foo(){} 这种形式,我们是跟踪不到函数初始化的。可是如果是定义类的方式,我们就可以明显地跟踪到函数的初始化顺序。比如:

function  foo() {}
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');
}

    调用 funAlert(),那么将显示一个MegBox,内容为'B'。

    为什么初始化函数会有这样的效果?这里只用把上面两个函数的定义改一下,就会一目了然了,我们把定义改为:

var  fnAlert  =   new  Function( " alert('A') " );
var  fnAlert  =   new  Function( " alert('B') " );

window.fnAlert();
    其函数也就是定义在对象上的一个函数指针,我们象这个指针赋什么函数引用,它就执行什么效果,而JavaScript中的脚本函数重名就和普通赋值语句一样,等同于:
var  i  =   0 ;
var  i  =   1 ;
    // 稍微注意以下JavaScript里的 var,用var定义变量和我们平时用的高级语言定义变量是不同的,它只起到一个提示的作用,提醒说我在这里定义变量了,而没有什么变量作用域的概念,只要不离开定义它的对象的域(比如页面刷新),出现过的变量会就一直存在。所以var写不写都行。举个例子:
if  ( true  )
{
   t 
=   100 ;
}
alert(t);

    将显示100,而

if  ( true  )
{
    
var  t  =   100 ;
}
alert(t);

    也是显示100。

    所以JavaScript的脚本函数名重不重复只是一个运算的问题,和我们高级语言里的语法约束完全不是一回事,当然也更不是overload的范畴。

    脚本函数名重名有什么用呢?最直观就是可以用来实现伪重载,比如我们不少免费的主页空间常常会给你强加弹出窗口广告,我们就可以在页面第一行写上:

< script  language ="javascript" >
    var _open = window.open;
    window.open 
= function() {}
</script>
    这样就可以屏蔽掉不是加在页面第一行上的弹出窗口广告(加在第一行不能拦截,因为window.open还没有被'重载'open就先执行了)。

-------------------------------------------------------
针对出现的问题解决方法:
1。修改javascript函数名就行。
2。共用一个函数:如
function getNextDay(index) {
    //var thisDay=Date.parse("2007-5-31");
    if(index==undefined){  /表示调用时无index参数getNextDay();
  var thisDay=new Date();
  thisDay.setDate(thisDay.getDate()+1);
  date.innerText=thisDay.toLocaleString().substring(0,10)+thisDay.getDay();
}
  else
alert(index);

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值