函数内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
相关产品推荐
相关产品推荐

