JavaScript当即执行函数

当即执行函数(Immediate Functions)

要了解当即执行函数,先了解函数的基本概念,函数声明,函数表达式,匿名函数javascript

函数声明:使用function声明函数,并指定函数名。java

function foo() {
    // coding   
}

函数表达式:使用function声明函数,但未指定函数名,将匿名函数赋予一个变量。express

var foo = function() {
    // coding
}

匿名函数:使用function关键字声明函数,但未指定函数名。匿名函数属于函数表达式,匿名函数有不少做用,赋予一个变量则建立函数,赋予一个事件则成为事件处理程序或建立闭包等等。安全

function() {
    // coding
}

 

函数声明与函数表达式的不一样在于:闭包

1. 函数声明可在当前做用域下提早调用执行,函数表达式需等执行到该函数后,方可执行,不可提早调用。函数

foo()
function foo() {
    // coding  
}
// 正常,函数声明可提早调用

foo()
var foo = function() {
    // coding
} 
// 报错,foo未保存对函数的引用,函数调用需放在函数表达式后面

2. 函数表达式可直接在函数后加括号调用。测试

var foo = function() {
    console.log(2)
}()

// 2   解析至此,可直接执行调用

当即执行函数(function(){})()能够看出很像函数表达式的调用,但为何要加括号呢?若是不加括号:spa

function(){
    console.log(1)
}()

// 报错,函数须要函数名

解析: 虽然匿名函数属于函数表达式,但未进行赋值,因此javascript解析时将开头的function当作函数声明,故报错提示须要函数名

当即执行函数里面的函数必须是函数表达式,因此由var setFn = function() {}()能够理解为在匿名函数前加了 = 运算符后,将函数声明转化为函数表达式,因此拿!,+,-,()...等运算符来测试下是否如此。.net

!function(){
    console.log(1)
}()
// 1
    
+function(){
    console.log(2)
}()
// 2
    
-function(){
    console.log(3)
}()
// 3
    
(function(){
    console.log(4)
})()
// 4

因而可知,加运算符确实可将函数声明转化为函数表达式,而之因此使用括号,是由于括号相对其余运算符会更安全,能够减小没必要要的麻烦。code

当即执行函数与正常函数传参形式是一致的。

 

这种模式有一些几部分组成:
  • 使用函数表达式定义一个函数(函数声明不能起做用)
  • 在结尾加上一对括号,让函数当即被执行
  • 将整个函数包裹在一对括号中(只有在你不将函数赋值给一个变量的时候才须要)

eg:

(function() {
        console.log("my first iife");
    })();

  

这里须要弄清楚一个概念 函数表达式和函数声明

函数表达式  Function Expression - var expression= function() {}; 

函数申明     Function Declaration - function test() {};

这样就好理解基本概念了吧!

下面来讲为何会考虑到马上执行函数

由于在.net或者其余平台下,做用域scope是按照块来划分的,可是在javascript中,变量的做用域是按照函数划分的,能够这样理解js中有时候并无block scope这种概念,只有function才有本身的scope,所以IIFE实际建立了一个封闭的scope,能够限制对变量和方法的访问,有时候也会避免全局变量引发的命名冲突,因此他出现了.

相关文章
相关标签/搜索