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);这里有两个容易混淆的点:- 你的
get函数没有定义参数,所以你传入的20完全不会被函数处理,相当于白传了; 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
相关产品推荐
相关产品推荐

