JS定义一个立即执行的可重用函数
我定义了一个函数表达式 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,访问这个属性会导致错误!
JS定义一个立即执行的可重用函数的更多相关文章
- Js定义一个表单并提交
Js定义一个表单 var form = $("<form>"); //定义一个form表单 form.attr('style', 'display:none'); // ...
- vue.js定义一个一级的路由 ----由浅入深
#### 定义一个路由- 实例化一个路由并设置路由映射表 - 实例化里面第一个参数 routes 路由映射表 - routes 里面参数 - path 路由的路径 - component 路由对应的组 ...
- js定义一个处理字符串的函数
//定义一个处理字符串的方法 function StringBuffer(str){ var arr = []; str = str || ''; arr.push(str); //追加字符串 thi ...
- 如何用python的装饰器定义一个像C++一样的强类型函数
Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.本文将介绍如何使用python的装饰器来定义一个像C++那样的强类型函数.接下去,先介绍 ...
- js生成一个不重复的ID的函数的进化之路
在MongoDB中的ObjectID,可以理解为是一个不会重复的ID,这里有个链接http://blog.csdn.net/xiamizy/article/details/41521025感兴趣可以去 ...
- JS 封装一个求n~m的求和函数
var a = 0; cc(2,10); function cc(n,m){ for(var i =n;i<(m+1);i++){ a = a + ...
- 如何定义一个高逼格的原生JS插件
插件的需求 我们写代码,并不是所有的业务或者逻辑代码都要抽出来复用.首先,我们得看一下是否需要将一部分经常重复的代码抽象出来,写到一个单独的文件中为以后再次使用.再看一下我们的业务逻辑是否可以为团队服 ...
- c#定义一个方法,根据存储过程名称和存储过程参数数组,执行对应的存储过程
定义一个根据存储过程名称和存储过程参数数组,执行对应的存储过程的方法.用SqlParameter[]代替存储过程需要的参数.这样就不用为每一个存储过程写一个方法了 1.首先定义一个ExcuteProc ...
- angular.js的ng-app 指令定义一个 AngularJS 应用程序。
<!DOCTYPE html> <html lang="en" ng-app> <head> <meta charset="UT ...
随机推荐
- java包的所有类生成class
javac的编译单位其实就是单个的java文件,为了达到同时编译多个java文件的目的,可以将所需编译的java文件路径保存在一个txt中,比如sourcelist.txt,以换行为分隔符(这个过程称 ...
- idea常用的插件
ignore 插件 可以自动生成.ignore文件 非常的实用 gitee 插件 搜所gitee安装即可 码云的插件 maven helper 插件 idea 中解决maven 包冲突的问题 a ...
- bootstrap3 input 验证样式【转】
feedback <form role="form"> <div class="form-group has-success has-feedback& ...
- JavaScript 从入门到放弃(一)事件委托和使用innerHTML添加元素
一.使用事件委托 一个简单的需求,比如想给ul下面的li加上点击事件,点击哪个li,就显示那个li的innerHTML.这个貌似很简单!代码如下! <!DOCTYPE html> < ...
- aop(Aspect Oriented Programming)面向切面编程
AOP,一个oop的后传,面向切面,一个基于代理模式的机制. 举例子把:说原理很难理解, 吃饭:谁都得吃饭,一个老师类,有吃饭的方法.一个学生类,也得有吃饭的方法.是不是都得实现这个方法?构建一个pe ...
- 四、NAND Flash
4.1 nand flash启动u-boot nand flash 启动的时候,CPU 需要将 nand flash 中前面 4KB 的内容复制到 SRAM 中执行,然后将 NAND Flash 中的 ...
- metasploit中meterpreter命令
meterpreter是Metasploit框架中的一个杀手锏,通常作为漏洞溢出后的攻击载荷所使用,攻击载荷在触发漏洞后能够返回给我们一个控制通道. 常见的meterpreter命令 run scri ...
- html5 流动布局
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- Linux - DDOS检测
netstat netstat -na #显示所有连接到服务器的活跃的网络连接 netstat -an | grep : | sort # 只显示连接到80段口的活跃的网络连接,80是http端口, ...
- mysql 架构~MGR监控手段
一 简介 今天咱们来聊聊MGR的监控 二 监控 方面: 1 节点mysql进程监控 2 节点mysql复制进程的监控 ...