从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 相关文章推荐
JSQL 基于客户端的成绩统计实现方法
May 05 Javascript
为JavaScript添加重载函数的辅助方法
Jul 04 Javascript
jQuery 开发者应该注意的9个错误
May 03 Javascript
JavaScript获取页面中第一个锚定文本的方法
Apr 03 Javascript
每天一篇javascript学习小结(Array数组)
Nov 11 Javascript
基于BootStarp的Dailog
Apr 28 Javascript
javascript 小数乘法结果错误的处理方法
Jul 28 Javascript
jQuery回调方法使用示例
Jun 26 jQuery
基于VUE实现的九宫格抽奖功能
Sep 30 Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 Javascript
关于vue的npm run dev和npm run build的区别介绍
Jan 14 Javascript
javascript自定义右键菜单插件
Dec 16 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实现简单的上传进度条
2015/11/17 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
编写Js代码要注意的几条规则
2010/09/10 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
2015/02/02 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
js密码强度校验
2015/11/10 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
Python协程的用法和例子详解
2017/09/09 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
python3使用GUI统计代码量
2019/09/18 Python
Python数据可视化:箱线图多种库画法
2019/11/06 Python
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
十佳美德少年事迹材料
2014/02/05 职场文书
个人买房协议书范本
2014/10/06 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
springboot临时文件存储目录配置方式
2021/07/01 Java/Android