首页 > 试题广场 >

以下输出内容 const print = (fn)={ l

[单选题]
以下输出内容
const print = (fn)=>{ 
  let a = 200;
  fn(); 
} 
let a = 100;
const fn = () => { 
  console.log(a);
} 
print(fn);


  • 200
  • 100
  • undefined

  • 以上都不正确
**解释闭包和词法作用域** 用户提到的问题涉及JavaScript中的闭包和词法作用域。解释时,箭头函数“fn”是在“let a = 100”之后定义的。箭头函数会捕获它定义时的外部作用域中的变量,因此它会识别全局作用域中的 `a = 100`。即使在函数执行时,`a` 的值变为200,函数仍会访问到它定义时捕获的值,输出100。所以选择B是正确答案。 已思考 13 秒 **答案选 B(输出 100)的原因:** ```js const print = (fn) => { let a = 200; // ① 这是 print 内部的局部变量 a fn(); // ② 调用传进来的函数 } let a = 100; // ③ 这是定义在“全局/外层作用域”的 a const fn = () => { console.log(a); // ④ 输出时查找的是自己“定义时”所在作用域里的 a } print(fn); ``` 1. **词法作用域(lexical scope)决定变量查找** JavaScript 在函数**定义**的那一刻就确定了它的“作用域链”。`fn` 定义在外层作用域(③ 行附近),所以它闭包捕获的是那个作用域里的变量 `a`(值为 100)。无论将来在哪儿调用 `fn`,它都只会沿着**定义时**的作用域链去找变量,而不会改走调用位置的链。 2. **print 里的 `a` 与 fn 无关** 当执行 `print(fn)` 时,`print` 自己又声明了一个局部变量 `a = 200`(①)。这个 `a` 只在 `print` 函数体里可见,和外层同名,但它**不会**覆盖 `fn` 已经捕获的那一个。 3. **调用阶段只是“执行”,不改变闭包** 在 ② 行调用 `fn()` 时,`fn` 仍然按定义时的作用域链去向外寻找 `a`——找到的是③行的 100,而不是①行的 200。 因此控制台最终打印的就是 **100**。
发表于 2025-05-07 12:01:52 回复(0)