21.非匿名自执行函数
1.函数名只读
// b 打印的值是什么 var b = 10; (function b(){ b = 20; console.log(b) })()
解析:
- 如标题一样,非匿名自执行函数,函数名不可以修改,严格模式下会TypeError, - 非严格模式下,不报错,修改也没有用。 - 查找变量b时,立即执行函数会有内部作用域,会先去查找是否有b变量的声明,有的话,直接复制 - 确实发现具名函数Function b(){} 所以就拿来做b的值 - IIFE的函数内部无法进行复制(类似于const)
打印结果为:Function b
2.
// 打印的值 var b = 10; (function b(){ var b = 20; console.log(window.b) console.log(b) })()
输出: 10 20
3.
var b = 10; (function b(){ console.log(b) b = 5 console.log(window.b) var b = 20 console.log(b) })()
22.变量提升(21.10.22 更新)
var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();
上面得代码相当于
var name = 'World!'; (function () { var name; if (typeof name === 'undefined') { name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();
2.看下第二个示例
var str = 'World!'; (function (name) { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })(str); //Hello World 因为name已经变成函数内局部变量