对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种匿名函数代码模式
匿名函数在调用了外部变量的时候才是闭包。
闭包是什么
简单的说就是函数中的函数,它的实现原理
每个函数上附加上一个额外的隐藏对象,这个对象其实就叫做闭包对象,它就是个普通的对象! 记录了本函数内部的变量列表而已。而且这个闭包对象还保存了一个指向上级函数的闭包对象的引用。这样一来,就形成了一个链条。当我们在一个函数里访问一个变量的时候,编译器会先看看在本闭包里到底有没有这个变量,如果没有就向上寻找。如果找到,那就用,如果一直找到头也没有,那就提示出错。