从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就先执行了)。

posted on 2005-01-08 02:31 birdshome 阅读(4558) 评论(7) 编辑 收藏

评论

#1楼  回复 引用   

function echo(str)
{
//alert(str);
document.write(str+'<br><br>')
}

function bb()
{
var k = 12;
// k = 12;
echo('b '+k);
}
var k=11;
echo('a '+k);
bb();
echo('c '+k);
2007-06-08 18:18 | 尝试[未注册用户]

#2楼  回复 引用   

// 稍微注意以下JavaScript里的var,用var定义变量和我们平时用的高级语言定义变量是不同的,它只起到一个提示的作用,提醒说我在这里定义变量了,而没有什么变量作用域的概念,只要不离开定义它的对象的域(比如页面刷新),出现过的变量会就一直存在。所以var写不写都行。
2007-06-08 18:19 | 尝试[未注册用户]

#3楼  回复 引用   

做变量来将要var和不要var是不同的,应为js是弱变量类型,所以可以不用先var声明变量,故楼主举例中两个都显示100,但是如果放函数里面就大不一样了,可以看我给的测试。
2007-06-08 18:24 | 尝试[未注册用户]

#4楼  回复 引用   

4年后 晚辈发表一下对于var的一点点认识
var在声明变量时是应该写的,否则将被默认声明为全局变量。函数内的var变量将被函数隐藏,否则也将是全局的。
2009-04-25 18:57 | SadTango[未注册用户]

#5楼  回复 引用 查看   

关于你说的var变量声明与作用域的问题是片面的,如果在函数中定义同名变量的话,对于函数中的同名变量声明var与否是很关键的,声明var则,上层变量不变,不声明,则上层变量会变
var i = 100;
alert(i);//100

function testVar(){
i = 11;
}
testVar();
alert(i);//11
2010-08-27 20:00 | 无爱      

#6楼  回复 引用 查看   

function funAlert(){alert('A');}
funAlert(); 结果为 B
function funAlert(){ alert('B');}

var fnAlert = new Function("alert('A')");
fnAlert(); 结果为A
var fnAlert = new Function("alert('B')");
2011-05-25 11:18 | aming      

#7楼  回复 引用 查看   

今天遇到了,挺经典的文章啊!
2012-01-30 15:02 | rgqancy      

导航

公告

  原创技术文章和心得,转载必须注明来源"博客园"!
  贴子以"现状"提供,且没有任何担保,同时也没有授予任何权利。
昵称:birdshome
园龄:7年10个月
荣誉:推荐博客
粉丝:73
关注:3

搜索

 

常用链接

我的标签

随笔分类(337)

文章分类(147)

相册

Ex-Colleagues

常用链接

兄弟情深

积分与排名

  • 积分 - 3145044
  • 排名 - 6

最新评论

阅读排行榜

推荐排行榜