交互式 JavaScript 面试练习
使用 DeepJS 执行可视化器练习真实的 JavaScript 面试题,先预测输出结果,再一步步追踪结果究竟是如何产生的。
声明实例化
函数内的 var 声明会在赋值语句执行前创建局部绑定。
词法作用域
与已存在的形参同名的 var 声明不会创建新绑定,而是复用形参的绑定。
JavaScript 采用词法(静态)作用域,函数的作用域链在定义时就已确定,与谁调用它无关。
函数内部的 var 绑定对外层全局环境不可见。
声明实例化只创建一个绑定,后续赋值会替换其中保存的值。
var 属于函数或脚本作用域,而不属于 if 代码块。
全局绑定
非严格脚本对无法解析名称的赋值可能在全局对象上创建属性。
参数 a 和局部 b 遮蔽全局变量,而 c 会解析到外层绑定。
函数调用
函数声明先初始化 a,随后 var 初始化器又用 2 覆盖同一个绑定。
参数接收数字值的副本,并保存在独立的函数绑定中。
闭包
fn 返回后,返回的函数仍然可以访问 fn 的 n 绑定。
var 在整个循环中只创建一个共享绑定,所有回调最终都会读到同一个最终值。
let 会在每次迭代时创建一个全新的 i 绑定,因此每个回调闭包捕获的都是自己独立的值。
立即调用一个函数并把 i 作为参数传入,会让每次迭代都拥有自己独立的参数绑定。