从JavaScript的函数重名看其初始化方式

2016-02-19 10:29 7 1 收藏

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享从JavaScript的函数重名看其初始化方式教程,希望对大家能有一点小小的帮助。

【 tulaoshi.com - Web开发 】

今天有个哥们问我要是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,而

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)if ( true )
{
    var t = 100;
}
alert(t);

    也是显示100。

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

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

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

来源:http://www.tulaoshi.com/n/20160219/1594791.html

延伸阅读
ALTER DATABASE DATAFILEd:\ORANT\DATABASE\USER1ORCL.ORA RESIZE 1000M; CREATE TABLESPACE INDEX_DATA DATAFILEd:\ORANT\DATABASE\INDEX_DATA SIZE 500M; ALTER DATABASE DATAFILEd:\ORANT\DATABASE\RBS1ORCL.ORA RESIZE 300M; ALTER DATABASE DATAFILEd:\ORANT\DASTABASE\TMP1ORCL.ORA RESIZE 300M; alter rollback segment "RB1" offlin...
单一类:(静态成员变量&静态初始化块)(成员变量&初始化块)构造函数 代码如下: public class 对象初始化顺序 {     public static void main(String[] args){         Person p = new Person();     } } class Person{     public static String staticf...
问题:        C++中如何初始化类中的表数据?在C语言中,我能像下面这样初始化结构数组:  // strUCt MYSTRUCT {     int x,y,z; };MYSTRUCT table[] = {     { 1,2,3 },     { 4,5,6 },     .....
《耻辱》初始化失败的解决方法 我想一定有很多人安装了最新的DLC后,打开游戏就弹出对话框,初始化失败吧,下面来介绍下解决办法: 如果用的是汉化贴里面那个R组全套+2DLC+9.0,并且是是XP系统,而且怎么弄也弄不进去,出现oxc0000142(初始化失败) 。 其实是破解的问题,R组的补丁不支持XP系统。 重新找个升级档破解补丁,复制到 Dishon...
一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元素的个数), Java中使用关键字new创建数组对象,格式为: 数组名 = new 数组元素的类型 [数组元素的个数] 实例: TestNew.java: 程序代码: public class TestNew {public static void main(String args[]) { int[] s ; int i ; s = new...

经验教程

440

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部