从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 IFrame 强制刷新代码
Jul 23 Javascript
jQuery 定时局部刷新(setInterval)
Nov 19 Javascript
JavaScript设计模式之工厂方法模式介绍
Dec 28 Javascript
浅谈javascript 归并方法
Jan 21 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
Dec 12 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
Jan 18 Javascript
JS简单实现浮动窗口效果示例
Sep 07 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
js实现京东轮播图效果
Jun 30 Javascript
在Vue组件中使用 TypeScript的方法
Feb 28 Javascript
非常漂亮的js烟花效果
Mar 10 Javascript
Element Breadcrumb 面包屑的使用方法
Jul 26 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/06/24 PHP
js Array对象的扩展函数代码
2013/04/24 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
浅析JavaScript中的事件委托机制跟深浅拷贝
2021/01/20 Javascript
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
Python3 log10()函数简单用法
2019/02/19 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
露营世界:Camping World
2017/02/02 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
会计专业自荐信范文
2013/12/02 职场文书
营销学习心得体会
2014/09/12 职场文书
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python
Pyhton模块和包相关知识总结
2021/05/12 Python
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android