这种模式是非常有用的,因为它为你初始化代码提供了一个作用域的沙箱;
考虑一下下面这种常见的场景:
你的代码在页面代码加载完成之后,不得不执行一些设置工作,比如附加时间处理器,创建对象等等,
所有的这些工作只需要执行一次,所以没有理由创建一个可复用的命名的函数,
但这些代码也需要一些临时的变量,但初始化过程结束后,就再也不会被用到了,
所以将这些变量作为全局变量不是个好主意,所以我们需要立即执行函数——去将我们所有的代码包裹在它的局部作用域中,不会让任何变量泄露成全局变量;
js分为全局作用域和函数作用域,全局作用域在函数内部可以访问到,但是函数内部的变量,外部无法访问到var name = 'zhangsan'
(function(){
console.log(name)//这里因为变量提升,name === undefined,所以结果是undefined
var name = 'lisi'
console.log(name)//这里执行的是 name = lisi ,所以自然就是lisi了
})()
console.log(name)//函数的作用域,在全局中无法访问,这里结果是张三
var name = 'zhangsan'
(function(){
console.log(name)//函数内部没有name 这个变量,所以像全局查找,全局有一个name,那么结果就是zhangsan
name = 'lisi'
console.log(name)//同理,这里结果是lisi,因为name被赋值成lisi
})()
console.log(name)//lisi
我这就不卖关子了,输出的结果分别是:2、4、1、1、2、3、3不知你答对了吗?
下面进入重点,我们进行分析
要想计算下面这几项,我们需要先了解 js 运算符的执行顺序,可以参考这个网址: 运算符优先级