JS 冷知识集合

第1题

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

大佬标准答案

知乎
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(){...}()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容