自执行函数有三种写法
( function ( “ 参数 ” ) { " 函数方法 " ; } ) ( “ 给参数传的值 ” )
( function ( " 参数 " ) { “ 函数方法 ” ; } ( " 给参数传的值 " ) )
function ( " 参数 " ) { " 函数方法 " ; } ( " 给参数传的值 " )
举个例子
var res1 = (function a(a,b){
console.log(a+b)//函数体内部的语句立即执行
return a+b
})(1,2)
console.log(res1) // 3 获取函数a的返回值
var res2 = (function b(n){
console.log(n)//函数体内部的语句立即执行
return n
},(8))
console.log(res2) // 8 获取函数b的返回值
//
var res3 = function c(n) {
console.log(n)//函数体内部的语句立即执行
return n
}(1)
console.log(res3) // 1 获取函数c的返回值
自执行函数返回值再操作
!function () { /* code */ } ();//返回值取布尔操作
~function () { /* code */ } ();//返回值取正负相反数再减1
-function () { /* code */ } ();//返回值取负值
作用域
自执行函数是很自私的,它的内部可以访问全局变量。但是除了自执行函数自身内部,是无法访问它的。
var n=1
var res1=function(){
var y=0
console.log(n) //1 可以访问外部空间的变量
}();
console.log(y) // 报错:Uncaught ReferenceError: y is not defined,外部获取不到函数内部的变量
补充
外部以函数表达式形式获取自执行函数是不可行的,只能得到undefined
var res1=function(){
console.log(1) //1 可以访问外部空间的变量
}();
console.log(res1) // 得到了undefined,因为自执行函数已经执行了,就不存在了,相当于只声明了res1未赋值,所以是undefined
通过递归方式是可以的
var res1=function a(){
return a
}();
console.log(res1)//得到a函数
当然通过return也可以获取到自执行函数的返回值
var res2 = (function b(n){
return n
},(8))
console.log(res2) // 8 获取到b函数的返回值n