从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 相关文章推荐
完整显示当前日期和时间的JS代码
Sep 17 Javascript
javascript AutoScroller 函数类
May 29 Javascript
使用POST方式弹出窗口的两种方法示例介绍
Jan 29 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
Feb 28 Javascript
JavaScript生成.xls文件的代码
Dec 22 Javascript
微信小程序 实战实例开发流程详细介绍
Jan 05 Javascript
JS优化与惰性载入函数实例分析
Apr 06 Javascript
JS运动特效之同时运动实现方法分析
Jan 24 Javascript
Vuex 快速入门(简单易懂)
Sep 20 Javascript
angular 用Observable实现异步调用的方法
Dec 27 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
Apr 09 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
Sep 08 Javascript
翻译整理的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
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
php实现倒计时效果
2015/12/19 PHP
php数值转换时间及时间转换数值用法示例
2017/05/18 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
奇妙的js
2007/09/24 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
javascript操作excel生成报表全攻略
2014/05/04 Javascript
jQuery中的编程范式详解
2014/12/15 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
JavaScript优化以及前段开发小技巧
2017/02/02 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
Python使用chardet判断字符编码
2015/05/09 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
python3 pygame实现接小球游戏
2019/05/14 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
使用python批量修改XML文件中图像的depth值
2020/07/22 Python
python爬取抖音视频的实例分析
2021/01/19 Python
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
《花瓣飘香》教学反思
2014/04/15 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
2015年统战工作总结
2015/05/19 职场文书
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
一起来学习Python的元组和列表
2022/03/13 Python
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js