从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 相关文章推荐
JavaScript DOM学习第一章 W3C DOM简介
Feb 19 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
Apr 14 Javascript
js带按钮的提示框可供选择示例代码
Sep 17 Javascript
jQuery 事件的命名空间简单了解
Nov 22 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
Sep 10 Javascript
jQuery滚动加载图片实现原理
Dec 14 Javascript
AngularJS递归指令实现Tree View效果示例
Nov 07 Javascript
JS中闭包的经典用法小结(2则示例)
Dec 28 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
May 08 Javascript
Angular事件之不同组件间传递数据的方法
Nov 15 Javascript
JavaScript实现放大镜效果代码示例
Apr 29 Javascript
从0搭建vue-cli4脚手架
Jun 17 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 木马攻击防御技巧
2009/06/13 PHP
PHP导入Excel到MySQL的方法
2011/04/23 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
图片自动更新(说明)
2006/10/02 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
python实现linux下使用xcopy的方法
2015/06/28 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
python模糊图片过滤的方法
2018/12/14 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
联想台湾官网:Lenovo TW
2018/05/09 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
如何执行一个shell程序
2012/11/23 面试题
计算机专业毕业生求职信分享
2013/12/24 职场文书
会计大学生职业生涯规划书范文
2014/01/13 职场文书
2014迎国庆演讲稿
2014/09/19 职场文书
七年级地理教学计划
2015/01/22 职场文书
万里长城导游词
2015/01/30 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python