# ❓下面的代码打印什么内容,为什么?

var b = 10
;(function b() {
  b = 20
  console.log(b)
})()
1
2
3
4
5

首先打印的是

// [Function b]

var b = 10
;(function b() {
  // 虽然这里是自执行函数
  // 但是这里是 非匿名 所以说函数名是只读(类似 const 机制)的不可修改

  // IIFE 内部作用域的 b 其实指向的是函数名字 b
  b = 20
  console.log(b)
})()
1
2
3
4
5
6
7
8
9
10
11

我们在严格模式下面就会看到错误

var b = 10
;(function b() {
  'use strict'
  b = 20 // TypeError: Assignment to constant variable.
  console.log(b)
})()
1
2
3
4
5
6

我们看看其他 🌰

var b = 10
;(function b() {
  window.b = 20 // 带window指向
  console.log(b) // [Function b]  依然是函数名字
  console.log(window.b) // 20
})()
1
2
3
4
5
6
var b = 10
;(function b() {
  var b = 20 // var声明 IIFE内部变量
  console.log(b) // 20
  console.log(window.b) // 10
})()
1
2
3
4
5
6

参考问题