第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();
总结: 通过函数表达式
的形式创建函数, 表达式后面是一个具名函数
的时候, 他的函数名只能在函数体里面访问的到, 并且这个函数名是被常量储存(类ES6
的 cons
t)的(在非严格模式下,给常量储存的值赋值, 会直接被忽略的, 严格模式下报错).
IIFE
函数只执行一次, 并且他也是函数表达式的形式创建, 也符合上面所说的结论.
拓展: IIFE 可以有多种变体
(function(){...})(); // 正常形式
(function(){...}())
!function(){...}()
~function(){...}()
-function(){...}()
+function(){...}()