对js立即执行函数的理解

js的匿名函数的常见2种用法  

1:(function(){})()
2:(function(){}())

今天看了一篇博客终于理解了这2种写法,首先要理解2点

函数声明:function(){}

函数表达式:var fun=function(){}

匿名函数:function(){},匿名函数属于函数表达式。

函数声明和函数表达式的不同:函数表达式后面加上()后可以直接马上执行。函数声明不可以。

其中重要的一点:

  在函数前面加上+ - ()后就可以将函数声明转化为函数表达式。

!function(a){
    console.log(a);   //firebug输出12345,使用!运算符
}(12345);
  
+function(a){
    console.log(a);   //firebug输出123456,使用+运算符
}(123456);
  
-function(a){
    console.log(a);   //firebug输出1234567,使用-运算符
}(1234567);
  
var fn=function(a){
    console.log(a);   //firebug输出12345678,使用=运算符
}(12345678)

加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。

javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。

注意:

   这样function(){}()是错的。因为在编译器解析的时候会被当成函数声名但没有名字最后报错。如果需要创建匿名函数,则必须给出一个函数表达式而非函数的显式声明。   匿名函数代码模式只 不过是通过括号或者void告诉编译器,把function(){}当作函数表达式来解释罢了。这其中并没有那么复杂 的优先级和void操作符原理。这只不过是一个简单的语法转换。可以想象,只要符合函数表达式的语法,我们就可以创建出N种匿名函数代码模式

 

匿名函数在调用了外部变量的时候才是闭包。

闭包是什么

     简单的说就是函数中的函数,它的实现原理

 每个函数上附加上一个额外的隐藏对象,这个对象其实就叫做闭包对象,它就是个普通的对象! 记录了本函数内部的变量列表而已。而且这个闭包对象还保存了一个指向上级函数的闭包对象的引用。这样一来,就形成了一个链条。当我们在一个函数里访问一个变量的时候,编译器会先看看在本闭包里到底有没有这个变量,如果没有就向上寻找。如果找到,那就用,如果一直找到头也没有,那就提示出错。

原文地址:https://www.cnblogs.com/sliuie/p/5113364.html