(转)从JavaScript函数重名看其初始化方式

转载 2007年09月29日 10:44:00

     在项目中不小心写了两个同名函数,但参数不同,以为没有问题,其实总是执行最后个javascript函数。具体原因见下:(下面内容转载)

    今天有个哥们问我要是JavaScript函数重名了会有什么后果?开始我没有细想,就说可能会出错吧,可是等我实验完了发现页面没有任何脚本错误提示,而且程序也运行了,只是对同名函数的调用执行了位置靠后的一个。

    回头仔细一想,这个结果完全可以接受,因为脚本在页面里本身就是顺序执行下来的,包括函数的定义,但然如果只是定义 function foo(){} 这种形式,我们是跟踪不到函数初始化的。可是如果是定义类的方式,我们就可以明显地跟踪到函数的初始化顺序。比如:

function foo() {}
function foo.prototype.fn1() {}
function foo.prototype.fn2() {}

    我们就可以明显地看到先执行function foo.prototype.fn1(){}再执行function foo.prototype.fn2(){}。

    回到我们刚才说的JavaScript脚本函数重名问题上来,比如我们定义两个函数 funAlert():

function funAlert()
{
    alert('A');
}

function funAlert()
{
    alert('B');
}

    调用 funAlert(),那么将显示一个MegBox,内容为'B'。

    为什么初始化函数会有这样的效果?这里只用把上面两个函数的定义改一下,就会一目了然了,我们把定义改为:

var fnAlert = new Function("alert('A')");
var fnAlert = new Function("alert('B')");

window.fnAlert();
    其函数也就是定义在对象上的一个函数指针,我们象这个指针赋什么函数引用,它就执行什么效果,而JavaScript中的脚本函数重名就和普通赋值语句一样,等同于:
var i = 0;
var i = 1;
    // 稍微注意以下JavaScript里的var,用var定义变量和我们平时用的高级语言定义变量是不同的,它只起到一个提示的作用,提醒说我在这里定义变量了,而没有什么变量作用域的概念,只要不离开定义它的对象的域(比如页面刷新),出现过的变量会就一直存在。所以var写不写都行。举个例子:
if ( true )
{
   t 
= 100;
}
alert(t);

    将显示100,而

if ( true )
{
    
var t = 100;
}
alert(t);

    也是显示100。

    所以JavaScript的脚本函数名重不重复只是一个运算的问题,和我们高级语言里的语法约束完全不是一回事,当然也更不是overload的范畴。

    脚本函数名重名有什么用呢?最直观就是可以用来实现伪重载,比如我们不少免费的主页空间常常会给你强加弹出窗口广告,我们就可以在页面第一行写上:

<script language="javascript">
    var _open = window.open;
    window.open 
= function() {}
</script>
    这样就可以屏蔽掉不是加在页面第一行上的弹出窗口广告(加在第一行不能拦截,因为window.open还没有被'重载'open就先执行了)。

-------------------------------------------------------
针对出现的问题解决方法:
1。修改javascript函数名就行。
2。共用一个函数:如
function getNextDay(index) {
    //var thisDay=Date.parse("2007-5-31");
    if(index==undefined){  /表示调用时无index参数getNextDay();
  var thisDay=new Date();
  thisDay.setDate(thisDay.getDate()+1);
  date.innerText=thisDay.toLocaleString().substring(0,10)+thisDay.getDay();
}
  else
alert(index);

}
 

JavaScript 重名的函数和对象

JavaScript 允许重复声明变量,后声明的覆盖之前的。var a = 1; var a = 'x'; console.log(a); //输出'x'JavaScript允许重复定义函数。 Jav...

安装新的Matlab工具箱前后的若干问题(流水总结帖-如何安装,函数重名问题,安装后出错问题)

由于需要要安装一个图切的工具箱,百度了一下,添加工具箱的方法很多,最终都是将工具箱所在路径添加到Matlab的搜索路径下,例如,将工具箱复制到toolbox目录下然后设置相应的搜索路径。下面根据网上内...

C#控制台基础 接口的函数成员重名,如何解决

镇场诗:慈心积善融学习,技术誓为大家学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 ——————————————————————————————————————————————...

C语言 调用的动态库函数重名问题分析

设计两个动态库 第一个动态库:libHelloc: func1.h #ifndef FUNC1_H_ #define FUNC1_H_ int func1(); void func(); ...

【C++】Accessor and Mutator Functions & 函数形参与类私有成员重名的解决方法

Accessor and Mutator functions. 函数形参与类私有成员重名时的解决方法

解决openwrt package目录下多个文件夹重名编译警告(call subdir 函数)

在openwrt的package中,如果出现文件夹重名。 例如,出现“package/dir1/a” 和“package/dir2/a” 两个目录结构,在a和a两个目录中分别都含有各自的makefie...

关于自定义函数与静态库中函数重名不报错问题的解决

上回书说道,在测试lapack的过程中,编写了main函数,同时在libf2c.a中同样定义了main函数,但上述两个函数在链接并未出现重定义错误,现就以上问题给出解释...

函数与自定义变量重名||函数提升

在js中声明函数和变量同样会有提升,因为函数本身也是一个变量。函数声明和变量声明都会置顶,但函数的优先于变量置顶。当变量名与函数名相同的时候,变量名会被先赋值成函数然后再被赋值为之前的初始值。(变量和...

多文件上传中重名文件问题,日期转特殊字符串

Today,牛刀小试了一下,在多文件上传的时候需要解决文件重名的问题(由于上传的路径是固定的,所以不能实现重名的文件的上传)。解决办法:   日期转换为字符串(可以保证唯一)加到文件名中,实现同一...

QQ影像支持qq控件重名下载

  • 2017年02月13日 09:44
  • 23.83MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(转)从JavaScript函数重名看其初始化方式
举报原因:
原因补充:

(最多只允许输入30个字)