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) }() => 123function 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 , []) => []
