立即调用表达式

分清几个概念:

表达式和语句

var square = function(x){ return x*x; }    //函数定义表达式 P63

function square(x){ return x*x;  }            //函数声明语句,var和function都是声明语句,它们声明或定义变量或函数。P94、95

调用表达式

JavaScript中调用表达式是一种调用(或者执行)函数或方法的语法表示。任何一个调用表达式都包含一对圆括号和左圆括号之前的表达式。

自定义表达式(自执行函数表达式)使用的场景

在JavaScript是函数作用域,我们可以定义一个函数用做临时的命名空间,在这个命名空间内定义的变量都不会污染到全局命名空间。假设你写的一大段代码要用在不同的程序中,代码中定义了一个变量存储中间值,那么,就会有这样的问题,当模块代码放到不同的程序中执行时,你无法得知这个变量是否已经创建过,如果创建过,就会和代码发生冲突。

例:

function mymodule(){
//模块代码

//这个模块所使用的所有变量都是全局变量,不会污染全局命名空间
}

mymodule();//调用这个函数

任何一个function在执行的时候都会创建一个执行上下文,因为为function声明的变量和函数有可能只在该function内部,这个上下文,在调用function的时候,提供了一种简单的方式来创建自由变量或私有子function。

例:

// 由于该function里返回了另外一个function,其中这个function可以访问自由变量i
// 所有说,这个内部的function实际上是有权限可以调用内部的对象。

function makeCounter() {
// 只能在makeCounter内部访问i
var i = 0;

return function () {
console.log(++i);
};
}

// 注意,counter和counter2是不同的实例,分别有自己范围内的i。

var counter = makeCounter();
counter(); // logs: 1
counter(); // logs: 2

var counter2 = makeCounter();
counter2(); // logs: 1
counter2(); // logs: 2

alert(i); // 引用错误:i没有defind(因为i是存在于makeCounter内部)。

很多情况下,我们不需要makeCounter多个实例,甚至不需要显示返回值。

更简便的方式——立即调用表达式

//方式一:
(function(){
//模块代码
}())

//方式二:
(function(){
//模块代码
}());

外层的圆括号不可少,有了该圆括号JavaScript解释器会将期解析为函数定义表达式,否则会解析为函数声明语句。而表达式是调用表达式所必须的。

时间: 2024-10-13 02:22:12

立即调用表达式的相关文章

jQuery立即调用表达式

http://www.imooc.com/code/3247 立即调用表达式 任何库与框架设计的第一个要点就是解决命名空间与变量污染的问题.jQuery就是利用了JavaScript函数作用域的特性,采用立即调用表达式包裹了自身的方法来解决这个问题. jQuery的立即调用函数表达式的写法有三种: 写法1: (function(window, factory) { factory(window) }(this, function() { return function() { //jQuery的

JavaScript基础之四(调用表达式和运算符)

1.函数的调用和对象创建 1)一对圆括号():用来调用函数: 2)如果在函数名称前使用了new fn(),这就是在创建对象了;分为两个步骤:1.new 会创建一个空的对象{},2.具体执行fn(),新的对象作为值传递给了this,给this添加属性就是在给新创建的对象添加属性了. 3)如果构造函数没有返回值,则新创建的对象就是当前的,如果构造函数有返回值,则该返回值代表新创建的对象. 2.运算符 1)关于顺序:①所有的1元运算符和3元?:都是从右往左计算:②大部分2元运算符从左往右:③=和与=结

表达式树基础代码

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Linq.Expressions; namespace TestExpressionLambda { class ProgramExpression { static void Main(st

表达式和运算符

1.原始表达式 最简单的表达式是“原始表达式”.原始表达式是表达式的最小单位——它们不再包含其他表达式JavaScript中的原始表达式包含常量或直接量.关键字和变量 例如: 1.23//数字直接量 “hello”//字符串直接量 true //保留字 undefined //变量 2.对象和数组的初始化表达式 对象和数组初始化表达式实际上是一个新创建的对象和数组 数组初始化表达式: var p=[1,3,5,6,8]; var p=[[1,2,3],[4,5,6],[7,8,9]]; var

第4章 表达式和运算符

表达式(expression)是JS中的一个短语,JS解释器会将其计算(evaluate)出一个结果 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 4.10 逻辑表达式 4.11 赋值表达式 4.12 表达式计算 4.13 其他运算符

Lambda表达式和Lambda表达式树

LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态. 为了富有效率的使用数据库和其他查询引擎,我们需要一种不同的方式表示管道中的各个操作.即把代码当作可在编程中进行检查的数据. Lambda表达式不仅可以用他们创建委托实例,而且C#编译器也能将他们转换成表达式树——用于表示Lambda表达式逻辑的一种数据结构.简言之——Lambda表达式用符号语言习惯的方法来表示LINQ数据管线中的操作. 作为委托的Lambda表达式 Lambda有特殊转换规则:表达式的类型本身并非委托类型,但它可

javascript权威指南第四章表达式与运算符

表达式:包括常量,变量,数组访问表达式 data = [1, 2, 3]. 运算符是将简单表达式组成复杂表达式的常用方法. 原始表达式:常量或直接量,关键字和变量. 对象,数组的初始化表达式实际就是新创建的对象和数组,这些初始化表达式有时也叫”对象(数组)直接量“,数组初始化表达式中的元素初始化表达式也可以是数组初始化表达式(也就是嵌套)例子: var matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];数组直接量中元素可省略 即:var sparseArray

委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: public static string Add(string a, string b) { return string.Format("{0} #### {1}",a,b); } //实名委托方式 Function&

JavaScript 方法调用模式和函数调用模式

这两天在读<JavaScript语言精粹>关于第4章函数调用的几种模式琢磨了半天. 这里就说一下方法调用模式跟函数调用模式. 方法调用模式: 当一个函数被保存为对象的一个属性时,我们称它为一个方法.当一个方法被调用时,this被绑定到该对象.如果调用表达式包含一个提取属性的动作(a.name或a[name]),那么他就是被当做一个方法调用. 1 var myObject = { 2 value:1, 3 double:function(){ //double是myObject对象的一个方法 4