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 ...
}());

http://zihui.lin.blog.163.com/blog/static/7292115420126335225160/

JavaScript基础-即时函数(Immediate Functions)(017)的更多相关文章

  1. (Frontend Newbie)JavaScript基础之函数

    函数可以说是任何一门编程语言的核心概念.要能熟练掌握JavaScript,对于函数及其相关概念的学习是非常重要的一步.本篇从函数的基本知识.执行环境与作用域.闭包.this关键字等方面简单介绍Java ...

  2. JavaScript基础学习-函数及作用域

    函数和作用域是JavaScript的重要组成部分,我们在使用JavaScript编写程序的过程中经常要用到这两部分内容,作为初学者,我经常有困惑,借助写此博文来巩固下之前学习的内容. (一)JavaS ...

  3. JavaScript 基础回顾——函数

    在JavaScript中,函数也是一种数据类型,属于 function 类型,所以使用Function关键字标识函数名.函数可以在大括号内编写代码并且被调用,作为其他函数的参数或者对象的属性值. 1. ...

  4. Javascript 基础--JS函数(三)

    一.基本概念:未完成某一个功能的代码(语句,指令)的集合. 二.函数的调用方式: 2.1.函数名(传递参数1,传递参数2)   基本语法 function 函数名(参数列表){ //代码; retur ...

  5. javascript基础(五)函数

    原文http://pij.robinqu.me/ 通过call和apply间接调用函数(改变this) call 和 apply带有多个参数,call和apply把当前函数的this指向第一个参数给定 ...

  6. javascript基础知识-函数

    1.javascript中函数有两种定义方式: 函数语句定义和表达式定义 //函数有定义 function test(){ console.log("This is a function&q ...

  7. JavaScript基础——创建函数

    JavaScript的最重要的一个部分是制作其他代码可以重用的代码.要做到这一点,你可以把代码组织成执行特定任务的函数.函数是结合在一个单一的块中,并给予一个名称的一系列代码语句.然后,你就可以通过引 ...

  8. JavaScript基础之函数与数组

     函数    函数的基本概念 为完成某一功能的程序指令(语句)的集合,称为函数.有的程序员把函数称为方法,希望大家不要被这两个名词搞晕了. 函数分为:自定义函数.系统函数(经常查看js帮助手册). j ...

  9. javascript基础知识--函数定义

    函数声明式 function funname( 参数 ){ ...执行的代码 } 声明式的函数并不会马上执行,需要我们调用才会执行:funname(); * 分号是用来分隔可执行JavaScript语 ...

随机推荐

  1. 利用init进程监控底层节点的方法架构

    native层利用底层节点变化,再针对变化进行相应的函数调用,实现某些功能. 架构如下: 底层提供节点更新,以及healthd读取节点的实现,都比较简单.而其余部分比较关键. 特别注意init监控pr ...

  2. 第十届蓝桥杯JavaC组省赛真题

    试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...

  3. Java实现 LeetCode 641 设计循环双端队列(暴力)

    641. 设计循环双端队列 设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront():将一个元素添加到双端队列头 ...

  4. Java实现 蓝桥杯VIP 算法提高 Quadratic Equation

    算法提高 Quadratic Equation 时间限制:1.0s 内存限制:512.0MB 问题描述 求解方程ax2+bx+c=0的根.要求a, b, c由用户输入,并且可以为任意实数. 输入格式: ...

  5. java实现 蓝桥杯 算法训练 操作格子

    问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求连续一段格子的最大值. 对于每个2.3操作输出你所求 ...

  6. java实现国庆星期日

    ** 国庆星期日** 1949年的国庆节(10月1日)是星期六. 今年(2012)的国庆节是星期一. 那么,从建国到现在,有几次国庆节正好是星期日呢? 只要答案,不限手段! 可以用windows日历, ...

  7. Linux ACL权限查看与设定

    getfacl 文件名,可以查看文件的acl权限 setfacl [选项] 文件名,可以设定文件的acl权限,例如:setfacl -m u:boduo:rx /project/ 这时候,创建了bod ...

  8. 死啃了String源码之后

    Java源码之String 说在前面: 为什么看源码: 最好的学习的方式就是模仿,接下来才是创造.而源码就是我们最好的模仿对象,因为写源码的人都不是一般的人,所以用心学习源码,也就可能变成牛逼的人.其 ...

  9. 手把手教你安装Ubuntu系统增强工具

    如果你不安装VMware增强工具的话,VMware经常会给你弹出下图的界面,提示你安装增强工具. 那么VMware增强工具到底有啥特别之处咧?其实在VMware虚拟机中安装好VMwareTools之后 ...

  10. JAVA多线程实现的三种方法

    JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...