You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript作用域练习疑问:为何结果是10而非30?

为什么你的代码输出是10而不是30?

嘿,我来帮你拆解清楚这个问题的核心原因,咱们一步步看你的代码:

首先先把你的代码贴出来方便分析:

var x = 30;
function get () {
  return x;
}
function set (value) {
  x = value;
}
set(10);
var result = get(20);
console.log(result);

关键步骤拆解:

  • 第一步:var x = 30; 声明了一个全局变量x,初始值是30。
  • 第二步:set(10); 调用了set函数,这个函数里的x = value;因为没有在函数内部声明x(比如用var/let/const),所以会直接修改全局变量x,这一步之后全局x的值就变成10了。
  • 第三步:var result = get(20); 这里有两个容易混淆的点:
    1. 你的get函数没有定义参数,所以你传入的20完全不会被函数处理,相当于白传了;
    2. get函数内部的return x,因为函数自身作用域里没有x,会向上查找作用域,找到全局的x——而此时全局x已经被set(10)改成10了,所以返回的就是10。
  • 最后:console.log(result)自然就输出10啦。

你可能的误区:

你以为get(20)会把20赋值给x或者让get返回20,但实际上你的get函数既没有接收参数的逻辑,也没有修改x的逻辑;另外set(10)已经提前把全局x改成了10,所以后续get拿到的是修改后的值,不是最初的30。

如果想让get返回传入的参数,你可以修改get函数:

function get(value) {
  return value; // 直接返回传入的参数
}

这时候调用get(20)就会返回20了。

内容的提问来源于stack exchange,提问作者josh_c

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:27:01