天天看点

工作中积累的问题、知识点总结100题(21-40)

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);
    }
})();      
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已经变成函数内局部变量