使用var在代码块内声明变量,为何查询说可外部访问却实际报错?
关于var在代码块外部访问的问题
首先明确:在标准ES5及更早的JavaScript规范里,var的作用域是函数级作用域,而非块级作用域。也就是说,在全局作用域的代码块(比如{ var num = 12345; })里用var声明的变量,会被提升到全局作用域,理论上在块外部是可以访问的。
你测试出现"变量未定义"的原因,大概率是以下两种情况之一:
控制台执行方式的问题
如果你是分两次在控制台执行代码:先运行{ var num = 12345; },再单独运行console.log(num),很多浏览器的控制台会把每次单独执行的代码当作独立的脚本上下文。第一次执行的变量仅存在于那次执行的临时上下文中,执行结束后上下文销毁,第二次执行时自然找不到该变量。
正确的测试方式是把代码放在同一段执行:{ var num = 12345; } console.log(num); // 此时会输出12345控制台启用了模块模式
现在部分浏览器控制台默认支持ES模块模式,当代码以模块模式执行时,即使是var声明的变量也不会挂载到全局对象,而是被限制在模块作用域内。你可以检查控制台的设置,切换到"传统脚本模式"再测试。
另外补充:如果你的代码是在函数内部的代码块里用var声明变量,那变量会被提升到该函数的作用域内,函数外部自然无法访问——这也是很多新手容易混淆的点,要注意区分全局作用域和函数作用域下的代码块。
内容的提问来源于stack exchange,提问作者RItesh Yadav
相关产品推荐
相关产品推荐

