源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

从JavaScript的函数重名看其初始化方式

  • 时间:2022-10-16 14:39 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:从JavaScript的函数重名看其初始化方式
今天有个[url=http://blog.transbaker.net/]哥们[/url]问我要是JavaScript函数重名了会有什么后果?开始我没有细想,就说可能会出错吧,可是等我实验完了发现页面没有任何脚本错误提示,而且程序也运行了,只是对同名函数的调用执行了位置靠后的一个。     回头仔细一想,这个结果完全可以接受,因为脚本在页面里本身就是顺序执行下来的,包括函数的定义,但然如果只是定义 function foo(){} 这种形式,我们是跟踪不到函数初始化的。可是如果是定义类的方式,我们就可以明显地跟踪到函数的初始化顺序。比如:
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] function foo() {} [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] function foo.prototype.fn1() {} [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] function foo.prototype.fn2() {}
    我们就可以明显地看到先执行function foo.prototype.fn1(){}再执行function foo.prototype.fn2(){}。     回到我们刚才说的JavaScript脚本函数重名问题上来,比如我们定义两个函数 funAlert():
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] function funAlert() [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] { [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]     alert('A'); [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] } [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] function funAlert() [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] { [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]     alert('B'); [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] }
    调用 funAlert(),那么将显示一个MegBox,内容为'B'。     为什么初始化函数会有这样的效果?这里只用把上面两个函数的定义改一下,就会一目了然了,我们把定义改为:
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] var fnAlert = new Function("alert('A')"); [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] var fnAlert = new Function("alert('B')"); [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] window.fnAlert();
    其函数也就是定义在对象上的一个函数指针,我们象这个指针赋什么函数引用,它就执行什么效果,而JavaScript中的脚本函数重名就和普通赋值语句一样,等同于:
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] var i = 0; [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] var i = 1;
    // 稍微注意以下JavaScript里的[b]var[/b],用var定义变量和我们平时用的高级语言定义变量是不同的,它只起到一个提示的作用,提醒说我在这里定义变量了,而没有什么变量作用域的概念,只要不离开定义它的对象的域(比如页面刷新),出现过的变量会就一直存在。所以var写不写都行。举个例子:
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] if ( true ) [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] { [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]    t = 100; [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] } [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] alert(t);
    将显示100,而
[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] if ( true ) [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] { [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]     var t = 100; [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] } [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] alert(t);
    也是显示100。     所以JavaScript的脚本函数名重不重复只是一个[b]运算[/b]的问题,和我们高级语言里的语法约束完全不是一回事,当然也更不是overload的范畴。     脚本函数名重名有什么用呢?最直观就是可以用来实现伪重载,比如我们不少免费的主页空间常常会给你强加弹出窗口广告,我们就可以在页面第一行写上:
<script language="javascript">     var _open = window.open;     window.open = function() {} </script>
    这样就可以屏蔽掉不是加在页面第一行上的弹出窗口广告(加在第一行不能拦截,因为window.open还没有被'重载'open就先执行了)。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部