1.即时函数的声明方法

即时函数(Immediate
Functions)是一种特殊的JavaScript语法,可以使函数在定义后立即执行:

(function
() {

    alert('watch out!');

}());

下面分几部来理解这种写法:

  1. 橙色部分是一个函数表达式;
  2. 天蓝色的一对括号代表立即执行它,括号里是执行这个函数需要的参数(这个例子不需要参数);
  3. 再用一对括号(就是黑色的这一对)把上面的部分包起来。

黑色这一对括号可以让人明白这个表达式得到的是函数的返回值,而不是函数对象。许多人更喜欢下面的写法,效果与上面的完全相同:

(function
() {

    alert('watch out!');

})();

2. 即时函数的应用场景

当你需要在程序启动时执行一些初始代码,这些初始化的工作只需要执行一次,而且当中用到的临时变量以后将不再有用,这时就可以把这些代码放到一个即时函数中执行:

(function () {
var days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
today = new Date(),
msg = 'Today is ' + days[today.getDay()] + ', ' + today.getDate(); alert(msg); }()); // "Today is Fri, 13"

3.即时函数的参数

下面的例子展示了一个带参数的即时函数:

// prints:
// I met Joe Black on Fri Aug 13 2010 23:26:59 GMT-0800 (PST)
(function (who, when) {
console.log("I met " + who + " on " + when);
}("Joe Black", new Date()));

有时,也可以把全局的this对象传给即时函数,这样就可以在不同的运行环境下复用即时函数中的代码:

(function (global) {
// access the global object via `global`
}(this));

当然,如果即时函数的参数比较多,而函数体又比较长的时候,你就需要上下来回的查看函数的参数列表定义和它的形参列表,这有时候挺烦人的。

4.即时函数的返回值

就如普通函数一样,即时函数也有返回值,可以把返回值赋给变量(注意,这里不是把函数对象赋值给变量):

var result = (function () {
return 2 + 2;
}());

如果把包在即时函数外的括号去掉,其效果完全相同。这种语法更简洁,但容易让人以为是把函数对象赋值给了变量,事实上变量得到的是函数的返回值:

var result = function () {
return 2 + 2;
}();

由于上面提到,即时函数有两种写法,所以下面的代码在效果上,与上面的两种写法完全相同:

var result = (function () {

    return 2 + 2;

})();

这三个例子返回的都是原始数据类型。实际上即时函数可以返回任何数据,包括函数对象:

var getResult = (function () {
var res = 2 + 2;
return function () {
return res;
};
}());

由于利用即时函数可以提供一段独立的局部作用域,最后还有返回值,所以也有人喜欢给对象的属性赋初始值的时候使用即时函数:

var o = {
message: (function () {
var who = "me",
what = "call";
return what + " " + who;
}()),
getMsg: function () {
return this.message;
}
};
// usage
o.getMsg(); // "call me"
o.message; // "call me"

上面的例子里,message是一个string类型的属性,而不是一个方法。

5.
即时函数的使用

即时函数提供局部的变量作用域,不会污染全局环境,同时其中的代码又能立即执行,所以经常用在模块化的程序中。如果我们把每一个功能
独立的代码段都用即时函数来组织,并放到一个单独的js文件中,那我们什么时候想使用,就把这个js文件引入进来就可以了:

// module1 defined in module1.js
(function () {
// all the module 1 code ...
}());

即时函数(Immediate Functions)的更多相关文章

  1. JavaScript基础-即时函数(Immediate Functions)(017)

    1.即时函数的声明方法 即时函数(Immediate Functions)是一种特殊的JavaScript语法,可以使函数在定义后立即执行:(function () {    alert('watch ...

  2. ajax的使用:(ajaxReturn[ajax的返回方法]),(eval返回字符串);分页;第三方类(page.class.php)如何载入;自动加载函数库(functions);session如何防止跳过登录访问(构造函数说明)

    一.ajax例子:ajaxReturn("ok","eval")->thinkphp中ajax的返回值的方法,返回参数为ok,返回类型为eval(字符串) ...

  3. 《理解 ES6》阅读整理:函数(Functions)(一)Default Parameter Values

    对于任何语言来说,函数都是一个重要的组成部分.在ES6以前,从JavaScript被创建以来,函数一直没有大的改动,留下了一堆的问题和很微妙的行为,导致在JavaScript中使用函数时很容易出现错误 ...

  4. php中的匿名函数(Anonymous functions)和闭包函数(closures)

    一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...

  5. WordPress get_allowed_mime_types函数(wp-includes/functions.php)存在跨站脚本漏洞

    漏洞版本: WordPress 3.6 漏洞描述: CVE ID:CVE-2013-5738 WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设 ...

  6. SQL Fundamentals || Single-Row Functions || 日期函数date functions

    SQL Fundamentals || Oracle SQL语言   SQL Fundamentals: Using Single-Row Functions to Customize Output使 ...

  7. SQL Fundamentals || Single-Row Functions || 数字函数number functions

    SQL Fundamentals || Oracle SQL语言 SQL Fundamentals: Using Single-Row Functions to Customize Output使用单 ...

  8. SQL Fundamentals || Single-Row Functions || 字符函数 character functions

    SQL Fundamentals || Oracle SQL语言   SQL Fundamentals: Using Single-Row Functions to Customize Output使 ...

  9. js即时函数在异步回调中的运用

    在编程中我们会接触到循环和异步编程的情况,这时异步回调执行逻辑就会出现问题.我们用setTimeout来模拟异步的: for(var i=0;i<3;i++){ setTimeout(funct ...

随机推荐

  1. cf221 D. Little Elephant and Array

    题解真的是太神奇了2333 用离线和树状数组(为什么感觉和HH的项链是的,什么鬼),比较巧妙的是他把整个数列分成几段.用一个vector来记录每个数出现的位置.一共就是data[a[i]][sz]-- ...

  2. 虚拟机安装centos6.5出现Error processing drive:pci-0000:00:10-scsi-0:0:0:0问题

    vmware安装linux系统出现Error processing drive:pci-0000:00:10-scsi-0:0:0:0问题 问题出现原因:我给虚拟机的内存太小了,只给了512M 解决办 ...

  3. 124-PHP类析构函数

    <?php class myclass{ //定义一个类 public function __destruct(){ //定义析构方法 echo '析构方法执行.<br />'; } ...

  4. 《新标准C++程序设计》3.6-3.7(C++学习笔记9)

    一.成员对象和封闭类 (1)定义 一个类的成员变量如果是另一个类的对象,就称之为“成员对象”. 包含成员对象的类叫封闭类. (2)封闭类构造函数的初始化列表 在构造函数中添加初始化列表的写法: 类名: ...

  5. 在Centos安装redis-孙志奇

    最近在阿里云服务器上部署redis,遇到了很多的问题,经过不懈的努力终于配置成功, 按照下面的步骤一步一步来就好了 wget http://download.redis.io/releases/red ...

  6. Apache nifi 第二篇(小白初试) nifi数据对接流程初次尝试

     一.准备工作 1.官网下载nifi 2.上传到linux随便哪里把,因为nifi是用java写的,所以首先要保证你的linux装了jdk 其次保证系统在装了zookeeper,因为nifi是一个分布 ...

  7. 【Android】家庭记账本手机版开发报告七

    一.说在前面  昨天 实现了账单的图标显示  今天 本地化,测试APP,将工程源码放到github上 源码:https://github.com/xiaotian12-call/Android_Boo ...

  8. POJ 1426:Find The Multiple

    Find The Multiple Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Su ...

  9. SpringBoot 系列教程之事务不生效的几种 case

    SpringBoot 系列教程之事务不生效的几种 case 前面几篇博文介绍了声明式事务@Transactional的使用姿势,只知道正确的使用姿势可能还不够,还得知道什么场景下不生效,避免采坑.本文 ...

  10. 使用技巧 --- 与VS Code相关

    目的:修改VS Code的注释文本颜色 S1:假设VS Code的安装路径是 %MVSC% S2:文件资源管理器进入目录 %MVSC%\resources\app\extensions\ S3:该目录 ...