从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 相关文章推荐
jQuery 入门级学习笔记及源码
Jan 22 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
jQuery对象和Javascript对象之间转换的实例代码
Mar 20 Javascript
javascript实现点击后变换按钮显示文字的方法
May 13 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
May 28 Javascript
AngularJS基础 ng-click 指令示例代码
Aug 01 Javascript
详解利用Angular实现多团队模块化SPA开发框架
Nov 27 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
Aug 30 Javascript
vue中,在本地缓存中读写数据的方法
Sep 21 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
Feb 19 Javascript
详解微信小程序中var、let、const用法与区别
Jan 11 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
Jul 28 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
模仿OSO的论坛(四)
2006/10/09 PHP
php 清除网页病毒的方法
2008/12/05 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
2017/03/07 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
js前端对于大量数据的展示方式及处理方法
2020/12/02 Javascript
python实现折半查找和归并排序算法
2017/04/14 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
机电一体化专业应届生求职信
2013/11/27 职场文书
企业诚信承诺书
2014/05/23 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书
解析redis hash应用场景和常用命令
2021/08/04 Redis
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技