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


Posted in Javascript onMarch 08, 2007

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

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

从JavaScript的函数重名看其初始化方式function foo() {}
从JavaScript的函数重名看其初始化方式
function foo.prototype.fn1() {}
从JavaScript的函数重名看其初始化方式
function foo.prototype.fn2() {}

    我们就可以明显地看到先执行function foo.prototype.fn1(){}再执行function foo.prototype.fn2(){}。

    回到我们刚才说的JavaScript脚本函数重名问题上来,比如我们定义两个函数 funAlert():

从JavaScript的函数重名看其初始化方式function funAlert()
从JavaScript的函数重名看其初始化方式{
从JavaScript的函数重名看其初始化方式    alert('A');
从JavaScript的函数重名看其初始化方式}
从JavaScript的函数重名看其初始化方式
从JavaScript的函数重名看其初始化方式
function funAlert()
从JavaScript的函数重名看其初始化方式{
从JavaScript的函数重名看其初始化方式    alert('B');
从JavaScript的函数重名看其初始化方式}

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

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

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

    将显示100,而

从JavaScript的函数重名看其初始化方式if ( true )
从JavaScript的函数重名看其初始化方式{
从JavaScript的函数重名看其初始化方式    
var t = 100;
从JavaScript的函数重名看其初始化方式}
从JavaScript的函数重名看其初始化方式alert(t);

    也是显示100。

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

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

<script language="javascript">
    var _open = window.open;
    window.open 
= function() {}
</script>
    这样就可以屏蔽掉不是加在页面第一行上的弹出窗口广告(加在第一行不能拦截,因为window.open还没有被'重载'open就先执行了)。
Javascript 相关文章推荐
获取当前网页document.url location.href区别总结
May 10 Javascript
一个很酷的拖动层的js类,兼容IE及Firefox
Jun 23 Javascript
jQuery 标题的自动翻转实现代码
Oct 14 Javascript
JS高级拖动技术 setCapture,releaseCapture
Jul 31 Javascript
js 判断浏览器使用的语言示例代码
Mar 22 Javascript
jquery实现当滑动到一定位置时固定效果
Jun 17 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
Oct 30 Javascript
iframe中子父类窗口调用JS的方法及注意事项
Aug 25 Javascript
Perl Substr()函数及函数的应用
Dec 16 Javascript
VueJS全面解析
Nov 10 Javascript
关于Vue Webpack2单元测试示例详解
Aug 14 Javascript
vue使用过滤器格式化日期
Jan 20 Vue.js
翻译整理的jQuery使用查询手册
Mar 07 #Javascript
用window.location.href实现刷新另个框架页面
Mar 07 #Javascript
javascript中的location用法简单介绍
Mar 07 #Javascript
JsEasy简介 JsEasy是什么?与下载
Mar 07 #Javascript
动态控制Table的js代码
Mar 07 #Javascript
js+FSO遍历文件夹下文件并显示
Mar 07 #Javascript
学习js所必须要知道的一些
Mar 07 #Javascript
You might like
?生?D片??C字串
2006/12/06 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
python+selenium开发环境搭建图文教程
2017/08/11 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
python虚拟环境迁移方法
2019/01/03 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
酒鬼酒广告词
2014/03/21 职场文书
2014年党员个人工作总结
2014/12/02 职场文书
个人工作表现自我评价
2015/03/06 职场文书
高中语文教学反思范文
2016/02/16 职场文书
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL