关于JavaScript立即执行函数

56 阅读1分钟
(
function(){
    console.log('hi')
}()
)
[1,2,3].map(item=> console.log(item))

上面这段代码会报错,因为前面函数返回值为undefined,所以被理解成undefined[3].map(item=> console.log(item)),所以应该写成:

(
function(){
    console.log('hi')
}()
);
[1,2,3].map(item=> console.log(item))

此外 ~/!/+/-/等都可以,用new会消耗内存

提问: 如何声明一个局部变量a,并打印这个a(不准用ES6)

!function (){
    var a
}()

用ES6

{
    let a
}

关于面试:

是什么:

声明一个匿名函数,然后立即执行它。这种做法就是立即执行函数

怎么做:

(function(){alert('我是匿名函数')} ()) // 用括号把整个表达式包起来  
(function(){alert('我是匿名函数')}) () // 用括号把函数包起来  
!function(){alert('我是匿名函数')}() // 求反,我们不在意值是多少,只想通过语法  
+function(){alert('我是匿名函数')}()  
-function(){alert('我是匿名函数')}()  
~function(){alert('我是匿名函数')}()  
void function(){alert('我是匿名函数')}()  
new function(){alert('我是匿名函数')}()  
var x = function(){return '我是匿名函数'}()

解决了什么问题:

在ES6之前,只能通过它来创建[局部作用域]

优点:

兼容性好

缺点:

怎么解决缺点:

使用ES6的block+let语法,即

{
    let a = '我是局部变量'
    console.log(a) //能读取到a
}
console.log(a) //找不到a