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

函数内var声明变量作用域疑问:name可全局访问oopsGlobal却报错?

关于JavaScript变量作用域的疑问解答

哎,我懂你的困惑!你以为是自己声明的局部变量能被外部访问,但其实这里藏了一个浏览器环境的小坑——你外部访问的name根本不是functionName里用var声明的那个局部变量!

核心原因拆解:

  • 首先,functionName里的var name = "sudeep"确实是函数局部变量,这个变量只在functionName执行时存在,函数执行完就会被销毁,外部完全访问不到它。
  • 那为什么你console.log(name)不报错?因为在浏览器的全局作用域中,有一个内置的全局变量name,它其实是window.name的简写,默认值是空字符串"",不管你有没有手动声明,它都存在。
  • 而oopsGlobal就不一样了:这个变量只在fun1内部用var声明,全局作用域里从来没有定义过它,所以外部访问自然会报错。

验证一下这个结论:

你可以修改代码试试:

function functionName() {
 var name = "sudeep";
 // 打印局部变量name,输出"sudeep"
 console.log("局部name:", name);
 // 打印全局的window.name,输出默认的空字符串""
 console.log("全局name:", window.name);
}
functionName();
// 外部打印的是全局name,输出""
console.log("外部访问的name:", name);
// 把函数里的变量改成其他名字,比如myName
function functionName2() {
 var myName = "sudeep";
}
functionName2();
// 外部访问myName,就会和oopsGlobal一样报错
console.log(myName);

总结你忽略的要点:

  • 浏览器全局作用域自带一些内置全局变量(比如name、document、location等),不要把这些变量名当作自己的局部变量名来测试,容易混淆。
  • 函数内部用var声明的变量确实是严格局部的,外部无法访问,你之前的误解只是因为刚好撞了内置全局变量的名字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:02:28