JavaScript函数未修改全局变量问题原因及修正方法
为什么你的JavaScript代码输出0而不是10?
嘿,这个问题其实是JavaScript变量作用域的典型坑!咱们一步步拆解:
问题根源
你看这段代码:
var num = 0; function change(){ var num = 10; // 这里的num是函数内部的局部变量 } change(); document.write(num); // 这里访问的是全局的num
当你在change函数里用var num = 10声明变量时,你其实创建了一个仅在函数内部生效的局部变量,它和全局作用域里的num是完全独立的两个变量。函数执行结束后,这个局部num就被销毁了,全局的num自始至终都是0,所以最后输出0。
正确的写法有两种常见方案:
方案1:修改全局变量(不推荐,但符合你的预期)
如果就是想修改全局的num,去掉函数内部的var关键字,这样JavaScript会自动向上查找作用域,找到全局的num并修改它:
var num = 0; function change(){ num = 10; // 直接赋值,不再声明新变量 } change(); document.write(num); // 现在输出10
方案2:通过返回值传递(更规范,避免全局变量污染)
更好的做法是让函数返回修改后的值,再赋值给全局变量(或者直接使用返回值),这样能减少全局变量的使用,代码更可控:
var num = 0; function change(){ var num = 10; return num; // 返回局部变量的值 } num = change(); // 将返回值赋值给全局num document.write(num); // 输出10
如果是现代JavaScript(ES6+),更推荐用let/const来声明变量,它们的块级作用域能避免很多这类混淆,但核心逻辑还是一样的——要明确你操作的是哪个作用域里的变量。
内容的提问来源于stack exchange,提问作者Hasnain Ali
相关产品推荐
相关产品推荐

