JS 冷知识集合

第1题

var b = 10;
(function b(){
    b = 20;
    console.log(b);  // function b() {b=20;console.log(b)}
})();

JS 冷知识集合_第1张图片
大佬标准答案

知乎
MDN
分析性大佬的答案

// 声名式 创建一个函数
function a(){
  a = 1;
  console.log(a); // 1
}
a()
// 函数表达式创建函数 (被赋值的是一个具名函数)
var b = function a() {
  a = 1;
  console.log(a); // function a(){ a = 1; console.log(a)}
}
b();
console.log(a); // undefined
// 严格模式再来一次
var b = function a() {
  "use strict"
  a = 1; // 报错 Uncaught TypeError: Assignment to constant variable 
           // 从报错信心可以看出 a 是一个被 常量储存的值 
  console.log(a);
b(); 

总结: 通过函数表达式的形式创建函数, 表达式后面是一个具名函数的时候, 他的函数名只能在函数体里面访问的到, 并且这个函数名是被常量储存(类ES6const)的(在非严格模式下,给常量储存的值赋值, 会直接被忽略的, 严格模式下报错).
IIFE 函数只执行一次, 并且他也是函数表达式的形式创建, 也符合上面所说的结论.

拓展: IIFE 可以有多种变体

(function(){...})(); // 正常形式
(function(){...}())  
!function(){...}()
~function(){...}()
-function(){...}()
+function(){...}()

你可能感兴趣的:(JS 冷知识集合)