> For the complete documentation index, see [llms.txt](https://mm.ricky.moe/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mm.ricky.moe/javascript/js-trap/lian-deng-fu-zhi.md).

# 连等赋值

## 引子

```javascript
function foo() {
  let a = b = 0;
  a++;
  return a;
}

foo();
typeof a; // => ???
typeof b; // => ???
```

## 解析

这个代码的重点在第二行:`let a = b = 0`。这个语句声明了一个局部变量 `a`，但是它也声明了一个全局变量`b`。

在 `foo()` 作用域或全局作用域中都没有声明变量 `b`。因此 JS 引荐将`b = 0` 表达式解释为 `window.b = 0`。

如下图所示，函数 `foo` 中的 `i` 都是一个偶然创建的全局变量：

同样，在咱们的问题中，`b` 是一个偶然创建的全局变量。在浏览器中，上面的代码相当于如下：

```javascript
function foo() {
  let a;
  window.b = 0;
  a = window.b;
  a++;
  return a;
}

foo();
typeof a;        // => 'undefined'
typeof window.b; // => 'number'
```

`typeof a` 是 `'undefined'`。变量 `a` 仅在 `foo()` 作用域中声明，在外部作用域内不可用。

`typeof b` 结果是 `'number'`。`b` 是一个值为 `0` 的全局变量
