鱼C论坛

 找回密码
 立即注册
查看: 464|回复: 3

[已解决]M方法中的隐式变量b不会往前提吗,为什么不输出undefined,反而报错

[复制链接]
发表于 2023-5-30 23:06:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.   <title>Document</title>
  8.   <script>



  9.     N();
  10.     function N(){
  11.       console.log('a: ' + a);//undefined
  12.       var a = 10;
  13.       console.log('a: ' + a);//10
  14.     }

  15.     M();
  16.     function M(){
  17.       console.log('b : ' + b)//报错
  18.       b = 10;
  19.     }
  20.   </script>
  21. </head>
  22. <body>
  23. </body>
  24. </html>
复制代码
最佳答案
2023-5-30 23:12:00
这里面包含了JavaScript的两个主题:变量提升(Hoisting)和作用域。

在 JavaScript 中,函数和变量的声明会被提升到他们所在的作用域的顶部。这就是为什么在  N  函数中可以在变量  a  声明之前就使用它。在这个例子中,变量  a  的声明(但不是赋值)被提升,所以在赋值前, a  的值是  undefined 。

然而在  M  函数中,你试图访问一个还没有声明的变量  b 。变量  b  不是一个声明的变量(比如使用  var ,  let ,  const  声明),它是一个隐式全局变量。在非严格模式下,尝试在赋值前引用这样的变量不会引发错误,而是将其视为  undefined 。但是在严格模式下( "use strict"; ),这样做会引发 ReferenceError 错误。JavaScript推荐在使用变量之前明确声明它,以此来防止意外创建全局变量。

根据你的代码片段,我猜测可能是运行在严格模式下,这就是为什么尝试引用变量  b  会报错。如果你希望在  M  函数的开始就可以访问变量  b ,你可以在顶部声明它,就像  a  一样。

这就是这段代码的执行方式:在  N  函数中, a  在声明之前就被提升了,而在  M  函数中, b  在声明之前没有被提升。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 23:11:53 | 显示全部楼层
在函数M中,变量b并没有被声明,因此JavaScript将其视为未定义(undefined)的变量。在调用console.log('b : ' + b)时,解释器无法找到变量b,因此会抛出一个ReferenceError(引用错误)。和变量a不同,虽然在N()函数之前调用了console.log('a: ' + a),但是由于var a = 10是在console.log之后的语句,所以变量a已经被声明,并且在第二个console.log语句中赋值为10。这是JavaScript的变量提升机制。反过来,在函数M中,在为变量b赋值之前,必须先声明该变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-30 23:12:00 | 显示全部楼层    本楼为最佳答案   
这里面包含了JavaScript的两个主题:变量提升(Hoisting)和作用域。

在 JavaScript 中,函数和变量的声明会被提升到他们所在的作用域的顶部。这就是为什么在  N  函数中可以在变量  a  声明之前就使用它。在这个例子中,变量  a  的声明(但不是赋值)被提升,所以在赋值前, a  的值是  undefined 。

然而在  M  函数中,你试图访问一个还没有声明的变量  b 。变量  b  不是一个声明的变量(比如使用  var ,  let ,  const  声明),它是一个隐式全局变量。在非严格模式下,尝试在赋值前引用这样的变量不会引发错误,而是将其视为  undefined 。但是在严格模式下( "use strict"; ),这样做会引发 ReferenceError 错误。JavaScript推荐在使用变量之前明确声明它,以此来防止意外创建全局变量。

根据你的代码片段,我猜测可能是运行在严格模式下,这就是为什么尝试引用变量  b  会报错。如果你希望在  M  函数的开始就可以访问变量  b ,你可以在顶部声明它,就像  a  一样。

这就是这段代码的执行方式:在  N  函数中, a  在声明之前就被提升了,而在  M  函数中, b  在声明之前没有被提升。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-31 01:12:34 | 显示全部楼层
isdkz 发表于 2023-5-30 23:12
这里面包含了JavaScript的两个主题:变量提升(Hoisting)和作用域。

在 JavaScript 中,函数和变量的声 ...

okok
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 14:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表