创建自执行函数表达式

首先贴一段这样的代码

//正确的代码var foo=function(){
  //函数内容
};
foo();

对于这段代码大家都很熟悉,创建一个函数表达式并且立即执行。接下来,我们试着去把这段代码简化,变成一个立即执行函数表达式。

//错误的代码function(){
    //函数内容
}()

这段代码与上面代码的区别就是把foo省略了,直接替换成function,但是很明显这样做是不行的,js会给我们报出一个错误。

为什么这样会报错呢?其实原因很简单,函数声明以function关键字开始,同时函数声明还有一个很重要的要求,便是function后面的函数名称functionName不能省略

,而此处的函数名称被省略掉了,所以自然也就出错,那么我们可以怎么改呢?在后面加一个functionName函数名称不就行了吗,好的,让我们来试一下

//错误的代码
function foo(){
    //函数内容
}()

实际上,就算在后面加上了函数名称这段代码还是无法正常执行的,js会给我们弹出一个错误“SyntaxError : Unexpected token”,这个错误是什么意思呢?我自己试着在js中只写了一个(),

然后执行,发现也会弹出错误,所以,我怀疑上面的代码是被解析成了这样

//错误的代码
function foo(){
    //函数内容
};
();

就是说js内部把function函数声明和最后的执行括号分开解析了,而由于后面的()里面没有表达式,所以js会弹出错误,无法正常执行。那么当我们试图在后面加入相关表达式是否就能解决这个问题呢?

//错误的代码
function foo(){
    //函数内容
}(1)

这时,我们在后面加了“1”,这时,代码确实不报错了(注意:不报错误并不代表函数就是成功执行了),然并卵,因为这个时候function里面的函数内容并没有执行,也就是说我们刚开始的目的:

//正确的代码
var foo=function(){
  //函数内容
};
foo();

把这段代码优化并没有成功,所以这个时候,我们试着去换另一种思路来试一下。既然函数声明无法立即执行,那么我们是否可以试一下把函数声明转换成函数表达式然后试图去立即调用呢?

说到这里,我们就要扯一下函数表达式与函数声明的转换。

function foo(){}    //这很明显是一个函数声明

var foo=function(){}    //这也很明显是一个函数表达式

//重点来了
!function foo(){}    //这是一个函数表达式
(function foo(){})    //这也是一个函数表达式

第一个和第二个例子是很容易理解的,但是对于第三四个可能就不是那么容易理解了。为什么最后两个会是函数表达式呢?

就js的解析器而言,如果一条语句以function关键字开始,那么解析器就会把它当作函数声明。所以呢,如果我们在function关键字前面加其它元素,就可以把函数声明转换成函数表达式。

所以

!function foo(){}
//前面加了一个!操作符,所以解析成函数表达式。
(function foo(){})
//加了一个()分组操作符,最终也解析为函数表达式。

那么,我们再说回之前的问题,对于刚开始的这段错误代码

//错误的代码
function(){
    //函数内容
}()

我们试图把它变成函数表达式而不是函数声明

//这是正确的演示
(function(){
    //函数内容
})()

事实证明,在function前面加了一个()分组操作符之后确实成功了,这段代码的执行效果与全文刚开始的地方贴出的代码执行效果是一样的,

而这段代码也是我们平时经常使用的一段代码,创建匿名立即执行函数,以保证全局变量不被污染。

其实除了上面的那种方式,还有一种类似的方法也是可以实现相同效果

//正确的演示
(function(){
    //函数内容
}())

而这两种方法也是有区别的,至于有什么区别大家可以自己去查阅一下,本文不再讲述,最后希望可以帮到需要的人。

时间: 2024-11-05 01:50:27

创建自执行函数表达式的相关文章

linux进程编程:子进程创建及执行函数简介

子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system();    下面分别做详细介绍.(1)fork()    函数定义:    pid_t fork();    函数说明:    linux下进程在内存中由三部分数据组成:代码段.数据段.堆栈段.在一个进程中,调用fork函数,可以创建.启动一个新进程.新进程与父进程共享代码段,复制父进程的数据段和堆栈段.创建成功后,fork()会向两个进程都有返回值.向父进程的返回值为子进程的进行号,向子进程的返回值为0.

js自执行函数表达式

// 下面2个括弧()都会立即执行 (function () { /* code */ } ()); // 推荐使用这个(function () { /* code */ })(); // 但是这个也是可以用的 和普通function执行的时候传参数一样,自执行的函数表达式也可以这么传参,因为闭包直接可以引用传入的这些参数,利用这些被lock住的传入参数,自执行函数表达式可以有效地保存状态. // 这个代码是错误的,因为变量i从来就没背locked住// 相反,当循环执行以后,我们在点击的时候i

IIFE(立即执行函数表达式)

我们经常会看到这样的写法: ;(fuction () { // do something })() 这就是一个简单的IIFE(立即执行函数表达式,immediately-invoked function expression)了. 这样的写法有什么好处呢?来简单分析一下. 1. 开头的分号 我们都知道,js是可以加分号或者不加分号的,在某些情况下,不加分号会让解析器解析出错,举个例子: var a = 0 , b = 0 ; a = b + 3 (b = a) // Uncaught TypeE

立即执行函数表达式(自执行函数)

立即执行函数表达式 立即执行函数表达式,大部分人也称为自执行函数. 自执行函数的写法 匿名函数 (function(){ console.log(2) })() 具名函数 (function log(){ console.log(2) })() 自执行函数的传参 (function add(a, b){ console.log(a + b) })(1,2) 返回值 let fn = (function add(a,b){ return a + b; })(2,4); console.log(fn

javascript立即执行函数表达式(IIFE)

常用的两种写法: (function(){ /* code */ }()); (推荐写法) (function(){ /* code */ })(); Q:为什么这样写,函数就嗯那个立即执行? A:因为在javascript里,括号内部不能包含语句,当解析器对代码进行解释的时候,先碰到了(),然后碰到function关键字就会自动将()里面的代码识别为函数表达式而不是函数声明. eg:如下代码就会报错. function(){ /* code */ }(); // SyntaxError: Un

JS-立即执行函数表达式(IIFE)

javascript函数调用 在javascript中,每一个函数在被调用的时候都会创建一个执行上下文,在该函数内部定义的变量和函数只能在该函数内部被使用,而正是因为这个上下文,使得我们在调用函数的时候能创建一些私有变量. 先声明后调用 // 声明: var foo = function(){ /* code */ }; // 调用: foo(); 如果想不声明直接调用 function(){ /* code */ }(); // 报错:SyntaxError: Unexpected token

自执行函数表达式

JavaScript里括弧()里面不能包含语句,所以在这一点上,解析器在解析function关键字的时候,会将相应的代码解析成function表达式,而不是function声明.(一个表达式会产生一个值) (function () { /* code */ } ()); // 推荐使用这个 (function(){alert(1);})();  // 但是这个也是可以用 // 由于括弧()和JS的&&,异或,逗号等操作符是在函数表达式和函数声明上消除歧义的 // 所以一旦解析器知道其中一个

JavaScript:立即执行的函数表达式

先要理解清楚几个概念: 以下转自:http://www.cnblogs.com/TomXu/archive/2011/12/31/2289423.html 问题的核心 当你声明类似function foo(){}或var foo = function(){}函数的时候,通过在后面加个括弧就可以实现自执行,例如foo(),看代码: // 因为想下面第一个声明的function可以在后面加一个括弧()就可以自己执行了,比如foo(),// 因为foo仅仅是function() { /* code *

JavaScript中的函数表达式

在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表现形式,函数表达式(Function Expression, FE)有下面四个特点: 在代码中须出现在表达式的位置 有可选的函数名称 不会影响变量对象(VO) 在代码执行阶段创建 下面就通过一些例子来看看函数表达式的这四个特点. FE特点分析 例子一:在下面代码中,"add"是一个函数对象