zl程序教程

您现在的位置是:首页 >  前端

当前栏目

通过javascript的匿名函数来分析几段简单有趣的代码

JavaScript代码 函数 简单 分析 通过 匿名 有趣
2023-06-13 09:14:23 时间
1、简单形式的封装调用
复制代码代码如下:

varuserName=function(){return"jeffwong"}();
alert(userName);


上面的代码确实简单,我们可以逐步分解成下面的写法:
复制代码代码如下:

varanonymousFunc=function(){return"jeffwong"};//匿名函数
varname=anonymousFunc();//执行该函数返回人名
alert(name);


2、new一下Function的形式(大写Function)
复制代码代码如下:
vara=newObject();
varb=newFunction();
//alert(typeof(a));//object
//alert(typeof(b));//function
alert(a);//[objectObject]
alert(b);//匿名函数
//alert(a==b);//false
//alert(a===b);//false



正如你所看到的那样,我们new一个Object,变量a弹出的是[objectObject],而new一个Function(注意,是大写Function),b在弹出的时候,生成了匿名函数。既然b是匿名函数,函数当然可以执行,我们可以继续试试下面的代码验证自己的猜测:
复制代码代码如下:
alert(b());//undefined
alert(a());//脚本错误提示“缺少函数”



3、new一下function也大有乾坤(小写function)
(1)、简单的空函数
复制代码代码如下:
varfunc=newfunction(){};
alert(typeof(func));//object
alert(func);//[objectObject]
//alert(func());//脚本错误func不是函数



其实上面的代码也就等价于下面的写法:
复制代码代码如下:
functionanonymousClass(){}//匿名类
varinstance=newanonymousClass();
alert(typeof(instance));//object
alert(instance);//[objectObject]

[code]

(2)、函数带个返回值的,也不是很难理解
[code]
varfunc=newfunction(){return"jeffwong"};
alert(typeof(func));
alert(func);
//alert(func());//脚本错误缺少函数



其实上面的代码也就等价于下面的写法:
复制代码代码如下:
functionanonymousClass(){return"jeffwong";}//匿名类
varinstance=newanonymousClass();
alert(typeof(instance));//object
alert(instance);//[objectObject]


(3)、还是函数带个返回值的,写法稍微有点不同

下面的代码请注意和(2)中的区分一下,因为接下来要重点讨论的就是那一点点的不同书写形式:
复制代码代码如下:
varfunc=newfunction(){returnnewString("jeffwong");};
alert(typeof(func));//object意料之中
alert(func);//这里?!
//alert(func());//脚本错误缺少函数



上面代码的等价形式依然简单:
复制代码代码如下:
functionanonymousClass(){returnnewString("jeffwong");}
varinstance=newanonymousClass();
alert(typeof(instance));
alert(instance);


已经运行看到结果了吗?没错,第三种写法我们在弹出func或者instance的时候,都出人意料地得到了一段字符串"jeffwong"。细心比较(2)和(3)中的代码,除了return处的写法稍有不同之外,两处代码几乎完全一致,所以我们推断,毫无疑问,是newString的形式让我们的函数产生了意想不到的效果。为什么会这样呢?

原来,在javascript中,只要在new表达式之后的constructor返回(return)一个原始类型(无return时其实是return原始类型undefined,如(1)),比如第(2)种写法,那么就返回new创建的匿名对象;而如果new表达式之后的constructor返回一个引用对象,比如对象(Object),函数(function)及数组(Array)等等,那么返回的该引用对象就将覆盖new创建的匿名对象。现在再来分析(3)中的写法,由于newString会构造一个字符串引用对象,它就覆盖了new所创建的匿名对象,而newString的所指向引用值是“jeffwong”,所以弹出的必然是当前newString所分配的值。

  最后,留个思考题,大家看看下面的代码返回什么结果:

复制代码代码如下:
varfunc=newfunction(){varstr=newString("jeffwong");returnstr;};//再换种写法
//alert(typeof(func));//object意料之中
alert(func);//猜一下这里应该是什么结果?

作者:JeffWong