从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 相关文章推荐
实现png图片和png背景透明(支持多浏览器)的方法
Sep 08 Javascript
ExtJs扩展之GroupPropertyGrid代码
Mar 05 Javascript
利用进制转换压缩数字函数分享
Jan 02 Javascript
JQuery工具函数汇总
Jun 15 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
Feb 02 Javascript
AngularJs ng-route路由详解及实例代码
Sep 14 Javascript
JavaScript每天必学之数组和对象部分
Sep 17 Javascript
JavaScript实现打地鼠小游戏
Apr 23 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
Feb 08 Javascript
ES6 Generator函数的应用实例分析
Jun 26 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
Aug 10 Javascript
vue 动态添加class,三个以上的条件做判断方式
Nov 02 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运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
php中explode与split的区别介绍
2012/10/03 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
javascript学习网址备忘
2007/05/29 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
js获取 type=radio 值的方法
2014/05/09 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
Python中的Matplotlib模块入门教程
2015/04/15 Python
python获取本机外网ip的方法
2015/04/15 Python
python字符串常用方法
2018/06/14 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
详解python算法常用技巧与内置库
2020/10/17 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
Html5 localStorage入门教程
2018/04/26 HTML / CSS
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
Android面试题及答案
2015/09/04 面试题
如何利用find命令查找文件
2016/11/18 面试题
优秀应届生推荐信
2013/11/09 职场文书
综合办公室个人的自我评价
2013/12/22 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
python通过opencv调用摄像头操作实例分析
2021/06/07 Python
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers