为何函数内修改的全局变量在外部也生效?代码示例解析
为什么函数内修改
num会同时改变全局变量的值? 先看你提供的示例代码:
let num = 50; const logNum = () => { num = 100; // Take note of this line of code console.log(num); } logNum(); // Prints 100 console.log(num); // Prints 100
这个结果完全符合JavaScript的作用域规则,Codecademy的示例没有错误。核心原因在于函数内部没有重新声明num变量:
- 当你在函数里写
num = 100时,JavaScript会先在当前函数的局部作用域中查找是否存在名为num的变量。 - 因为函数内没有用
let/const/var声明过num,JS会沿着作用域链向上查找,最终找到全局作用域中用let num = 50声明的变量。 - 此时的赋值操作直接修改了全局作用域里的
num,所以函数内外打印的结果都是100。
如果你想让修改只在函数局部生效,需要在函数内部重新声明num变量,比如:
let num = 50; const logNum = () => { let num = 100; // 局部声明num console.log(num); // 打印局部的100 } logNum(); console.log(num); // 打印全局的50
这种情况下,函数内的num是一个全新的局部变量,和全局的num互不影响,这才是你最初预期的“局部生效”的场景。
内容的提问来源于stack exchange,提问作者nathan-blackburn
相关产品推荐
相关产品推荐

