IIFE imediately-invoked-function-expression,立即执行函数
由两部分组成
1、圆括号运算符中的函数表达式,有独立的作用域
2、圆括号调用函数
两种书写方式
(function(){}()) 有无名称都不重要,自动忽略
面试题
var a = 10;
if( function b () {} ){
a += typeof(b)
}
console.log(a) => '10undefined'
作用:1、外界访问不了内部变量
2、避免污染全局变量(匿名,执行后立即销毁)
传参方式,在后面括号中传参
(function(a, b){
console.log(a + b)
})(3, 4)
3、立即执行函数执行后,会立即销毁。
var a = (function(){})()
console.log(a) => undefined
保存立即执行函数运行结果,可以用一个变量来接受
var a = (function(a=1,b= 5){
return a + b
}) => 6
4、什么时候可以立即执行函数? => 函数表达式( ()括起来的就是表达式 )后面可以直接调用,如:
(function(){})()
函数声明后面不能直接调用
将函数声明转换为表达式的方法: 加 + 、-、!、 || 、&&
1 && function fn(){ console.log(123) }() => 123
function test(){}(6) //=> 这样不会报错,不会调用函数,因为js把括号里面的参数看成表达式
function test(){}() //=> 这样会报错
重点面试题:
function fn () {
var arr = [ ];
for(var i = 0; i < 10; i++){
arr[i] = function(){
console.log(i)
}
}
return arr
}
var myArr = fn()
for (var i = 0; i < myArr.length;i ++){
myArr[i]()
} //=> 10个10; 此时myArr中每个函数引用着fn的AO,AO中的i现在为10;所以打印10个10;
(1)怎么打印0-9,利用立即执行函数
function fn (){
for(var i = 0;i<10;i++){
(function(){
console.log(i)
})()
}
}
(2)给函数传参,打印每个函数自身的AO属性
function fn () {
var arr = [ ];
for(var i = 0; i < 10; i++){
arr[i] = function(num){
console.log(num)
}
}
return arr
}
var myArr = fn()
for (var i = 0; i < myArr.length;i ++){
myArr[i](i) //给函数传参,打印每个函数自身的AO属性
}
(3) 利用立即执行函数,用立即执行函数包裹
function fn () {
var arr = [ ];
for(var i = 0; i < 10; i++){
(function(num){
console.log(num)
arr[i] = function(){console.log(num)}
}
)(i)
}
return arr
}
var myArr = fn()
for (var i = 0; i < myArr.length;i ++){
myArr[i]()
}
//利用立即执行函数,创造一个单独的作用域。
逗号运算符l,返回逗号后面元素
var a = (123 , []) => []