从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 相关文章推荐
仿百度的关键词匹配搜索示例
Sep 25 Javascript
JS+DIV实现鼠标划过切换层效果的方法
May 25 Javascript
ajax在兼容模式下失效的快速解决方法
Mar 22 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 Javascript
jQuery插件zTree实现获取一级节点数据的方法
Mar 08 Javascript
jQuery实现按比例缩放图片的方法
Apr 29 jQuery
基于vue 添加axios组件,解决post传参数为null的问题
Mar 05 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
Aug 19 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
Mar 29 Javascript
百度小程序自定义通用toast组件
Jul 17 Javascript
详解nvm管理多版本node踩坑
Jul 26 Javascript
js实现简易计算器小功能
Nov 18 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
$()JS小技巧
2007/07/21 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
js闭包实例汇总
2014/11/09 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
vue中轮训器的使用
2019/01/27 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
Python守护进程和脚本单例运行详解
2017/01/06 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
Python实现中值滤波去噪方式
2019/12/18 Python
Python装饰器结合递归原理解析
2020/07/02 Python
python实现ping命令小程序
2020/12/28 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
用友笔试题目
2016/10/25 面试题
幼儿园食品安全责任书
2015/05/08 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书