当前位置: 首页 > 知识库问答 >
问题:

javascript - js中var变量的问题?

莘聪
2023-11-01

代码如下:

<!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>  </head>  <body>    <script>      a = 1;      function test() {        console.log(a); // undefined        var a = 2;        console.log(a); // 2      }    </script>    <button onclick="test()">test</button>  </body></html>

为什么第一个log打印是 undefined 而不是 1?那个全局的 a 应该在这里生效的才对啊

共有4个答案

梁丘伟
2023-11-01

1)这是作用域的问题。
2)方法执行,会先行在函数体里找变量,没有再向上。
3)在这里,能找到,但在下面,所以执行时是undefined

公羊晟
2023-11-01

关键词:变量提升 �� javascript - js变量提升与函数提升的机制 - Lee Tsang - SegmentFault 思否

顾恺
2023-11-01
首先声明,是GPT-3.5给的答案哈。。。。

在你的代码中,虽然你在<script>标签中声明了全局变量a = 1;,但是在函数test()内部的第一次console.log(a);却输出的是undefined而不是1。这是因为在JavaScript中,变量声明会被提升(hoisting),而初始化则不会。

在函数内部,JavaScript将var a = 2;的声明提升到了函数的顶部,但它的初始化部分却保留在原来的位置。这就导致了在console.log(a);之前,a已经被声明了,但它的值还没有被赋予,因此默认为undefined

所以,实际的执行顺序是:

  1. 在函数test()内部,变量a被声明,并被提升到了函数顶部。
  2. 第一个console.log(a);打印的是提升后的a,此时还没有赋值,所以为undefined
  3. 然后,var a = 2;语句将a赋值为2
  4. 第二个console.log(a);打印的是已经赋值的a,所以输出2

如果你想让第一个console.log(a);输出全局的a的值1,你可以在函数内明确指定使用全局作用域的变量,而不是在函数内声明一个新的a。可以这样修改代码:

function test() {  console.log(window.a); // 1  var a = 2;  console.log(a); // 2}

在这里,window.a明确指定了全局作用域的变量,所以它输出的是全局变量a的值。

公孙智
2023-11-01

这是因为 JavaScript 中存在变量提升(Hoisting)的概念。当你在函数或全局范围内声明变量时,JavaScript 会将变量的声明提升到它们所在的作用域的顶部。这意味着,即使你在后面才给变量赋值,JavaScript 也会在程序开始时将变量声明提升到顶部。

在你的代码中,你在函数 test 内声明了一个局部变量 a。这使得在函数内部,a 的值只会是局部变量 a 的值,而不是全局变量 a 的值。尽管你在函数内部先打印了 a,然后再声明了局部变量 a,但由于变量提升,JavaScript 会先找到局部变量 a 的声明,并将其提升到函数的顶部。因此,当你打印 a 时,它还是 undefined,因为此时还没有给局部变量 a 赋值。只有在你执行 var a = 2; 时,局部变量 a 才被赋值,此时它的值才变成 2

如果你希望在函数 test 内使用全局变量 a 的值,你可以直接引用全局变量 a,而不需要再声明一个局部变量 a。例如:

<!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>  </head>  <body>    <script>      a = 1;      function test() {        console.log(a); // 1        a = 2;        console.log(a); // 2      }    </script>    <button onclick="test()">test</button>  </body></html>
 类似资料:
  • 本文向大家介绍js中let和var定义变量的区别,包括了js中let和var定义变量的区别的使用技巧和注意事项,需要的朋友参考一下 javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是”javascript 严格模式”,比如下述的代码运行就会报错: 错误信息如下: 解决方法就是,在文件头添加”javascript 严格模式”声明: let和var关键字的异同 声

  • 问题内容: 我知道在PHP中可能有“变量”变量。例如 是否可以在JavaScript中将变量的名称引用为字符串?怎么做? 问题答案: 对此没有单一的解决方案(当然,有,但是请不要认真考虑)。可以通过来动态访问 一些 全局变量,但这不适用于函数本地的变量。 不会 成为属性的全局变量是使用和和定义的变量。 几乎总是比使用可变变量更好的解决方案! 相反,您应该查看数据结构并为您的问题选择正确的结构]。

  • 本文向大家介绍javascript定义变量时有var和没有var的区别探讨,包括了javascript定义变量时有var和没有var的区别探讨的使用技巧和注意事项,需要的朋友参考一下 我们先来看一段代码 有过C++或Java编程经验的人可能会说:“这程序,死定了,变量竟然在引用了该变量的函数后边定义,bug会灭掉你的。”放在浏览器上运行一下,结果怎样?完美运行!接下来我们就说一下这是咋回事——有v

  • 在c/c++里面定义名称 变量最好是下划线,比如 dog_name 函数最好是驼峰,比如getDogName 在js里面我读了很多的帖子和指导说明,都说js里面的变量定义不管是变量还是函数,都是要用驼峰。 我个人感觉,c/c++的这种能够区分变量和函数的命名方法更具有可读性。 那么请问各位大佬,为什么在js里面不推荐用下划线,而是统一用驼峰命名?感谢。

  • 问题内容: “ var”是可选的吗? 如同 ? 我发现它们都可以通过我的测试工作,我认为这是可选的。那正确吗? 问题答案: 他们的意思不同。如果使用变量,则在范围内声明变量(例如,在函数中)。如果不使用,则变量会在作用域的各个层中冒出气泡,直到遇到给定名称的变量或全局对象(如果在浏览器中是窗口,则为窗口),然后将变量附加到该变量。这与全局变量非常相似。但是,仍然可以使用删除它(很可能是其他人的代码

  • 本文向大家介绍JavaScript变量声明var,let.const及区别浅析,包括了JavaScript变量声明var,let.const及区别浅析的使用技巧和注意事项,需要的朋友参考一下 var声明变量的作用域限制在其声明位置的上下文中 let 声明的变量只在其声明的块或子块中可用,var的作用域是整个封闭函数 在 ECMAScript 2015 中,let绑定不受变量提升的约束,这意味着le