我定义了一个函数表达式 testFun

var testFun = (function() {  ... //函数内容})();

测试结果:虽然 testFun 函数有如愿在页面加载后立即被执行,但再次执行该函数却没有任何效果

testFun(); //在如上定义并立即执行后在其它地方调用该函数,没有效果

目标需求为,在定义一个函数表达式时让这个函数在该JS页面加载完毕后立即执行,而后其它函数需要使用该函数时仍然可以通过函数名 testFun 调用执行。

[注:本文斜体字为示例名称]

也许可以这么干

你也许会说,在定义后直接马上调用执行一次不就行了?就像下面这样:

var testFun = function() {  ... //函数内容};testFun();//马上执行该函数

或者还可以这么干:

window.onload=testFun;//将函数应用赋给onload事件var testFun = function() {  ... //函数内容};

没错,这是能达到目标效果。但是不太好看。毕竟JS支持声明定义后立即执行函数,为什么不能通过该立即执行函数的引用再次调用它呢?

定义后立即执行的函数表达式

首先,怎么让函数定义后立即执行呢?(注意下例代码中的括号)

方法1:

(function testFun(){  ... //函数内容}()); 

方法2:

(function testFun(){  ... //函数内容})(); 

方法3:

var testFun = function(){  ... //函数内容})(); 

以上方法均能令 testFun 函数在定义后立即被执行。

难以重用以上定义过的函数

如果在同一个JS文件中的其它位置运用以下代码是不会有任何效果的。

testFun(); 

用typeof测试一下当前的 testFun 是什么类型

alert(typeof(testFun)); //undefined

得到的结果居然是undefined,这是怎么回事呢?

如下例:

testFun = ( function() {...} )();//等价于function A() {...};testFun = A();

原因就是, testFun 定义后立即被执行了,执行完却没有返回值,所以 testFun 未定义(undefined)。

return this如何?

第一反应是,加一个return this试试?

testFun = ( function() {  ...  return this;})(); //该函数仍旧定义后立即被执行一次

在同一个JS文件的其它地方重新调用该函数

testFun();//没有效果

依旧没有任何效果,还是用typeof测试一下

alert(typeof(testFun)); //Object

为何return this后该“函数表达式”是一个Object而不是function呢?

这是因为return this的this指向的是window!

可行操作

其实,在定义立即执行函数的函数末尾加上 return arguments.callee; 即可达到理想效果,如以上方法3变更为

var testFun = function(){  ... //函数内容  return arguments.callee;})(); 

那么,这个arguments.callee是何方神圣呢?

arguments.callee

arguments.callee是一个指向正在执行的函数的指针。

这就不难理解上例中arguments.callee的作用了:指向被定义后被立即执行的函数本身并返回给testFun.

不过需要注意的是,在严格模式下,不能通过脚本访问argument.callee,访问这个属性会导致错误!

最新文章

  1. rhel 7.0 配置centos yum源(2016/12/8),成功!
  2. C语言采用文本方式和二进制方式打开文件的区别分析
  3. ffmpeg-20160520-git-bin
  4. sqlite函数大全
  5. [转] jQuery Infinite Ajax Scroll(ias) 分页插件介绍
  6. 常见MFC UI界面库
  7. 关于C#匿名方法
  8. Maven可继承的POM 元素
  9. BZOJ 2654: tree( 二分 + MST )
  10. Debian 8开启sftp服务
  11. face recognition[angular/consine-margin-based][L2-Softmax]
  12. SecureCRT for ubuntu 菜单消失
  13. nodejs 模块moment格式化时间,获取当前时间的前一天时间
  14. 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))
  15. MyBatisPartA
  16. LevelDB源码分析之:arena内存管理
  17. 《JAVA多线程编程核心技术》 笔记:第五章:定时器Timer
  18. Oracle 角色及其权限
  19. ibatis 动态查询
  20. [省选]板块(shenben已经AFO!!!)

热门文章

  1. Logstash配置文件介绍
  2. MySQL中的时态(日期/时间)数据类型
  3. JavaSE学习总结(十七)—— IO流
  4. python---redis缓存页面前戏之剖析render源码
  5. CM记录-JVM调优
  6. java中常用的包及作用
  7. AVL树的JAVA实现及AVL树的旋转算法
  8. VUE优秀的组件库总结
  9. u-boot移植(六)---代码修改---串口
  10. 20155333 2016-2017-2 《Java程序设计》第六周学习总结