繁体   English   中英

JavaScript吊起和变量分配(无声明)

[英]Javascript hoisting and variable assignment (with no declaration)

查看MDN对JavaScript,语法和类型的介绍部分 -阅读:

声明变量

您可以通过三种方式声明变量:

  • 使用关键字var。 例如,var x =42。此语法可用于声明局部变量和全局变量。
  • 通过简单地为其分配一个值。 例如,x =42。这始终声明一个全局变量。 它会生成严格的JavaScript警告。 您不应该使用此变体。
  • 使用关键字let。 例如,让y =13。此语法可用于声明块作用域局部变量。 请参阅下面的可变范围。

以下代码片段似乎适合“通过简单地为其分配值”方案,这意味着应将变量视为全局变量。

(function(){
   console.log(myVar);
   //the following will throw a ReferenceException error
   //myVar = 10;

   //the following will not, and I can understand it following the defintion of the behavior of using `var` keyword
   //var myVar = 10;
})();

但是,运行代码将在注释myVar时生成ReferenceException,而在未注释时则未定义。 我希望这两种情况都将产生未定义的,因为如果myVar是全局变量(按定义),则比javascript的变量提升在到达console.log(myVar);之前要使它已知console.log(myVar);

这种行为背后的解释是什么? (我描述的行为是在firefox的控制台中尝试时得到的结果,但是在jsfiddle运行它不会引发错误)。

自我执行功能是否是吊装的例外?

“通过简单地为其分配值”方案

您正在读取值,而不是分配值

如果myVar是全局变量(按定义),

不是。

myVar是:

  • 如果函数包含var myVar (或function myVar () { ... } ,或者在函数定义中作为参数列出function myVar () { ... }则该变量的作用域范围为函数
  • 如果该块包含let myVar则该变量的作用域为该块
  • 全局变量(如果先前已为其分配值并且以上条件均不成立)。

由于您尚未分配值,因此它不是全局值。 由于上述条件都不成立,因此它不是任何变量,因此会出现参考错误。


关于您的评论:

在我要描述的场景中表示var时,我离开了var。 更新的问题。

…以及您引用的修改

注释掉的代码不评估。 使用关键字var的注释不会执行任何操作。


关于您的进一步编辑。

如果尝试在声明变量之前读取变量,则会出现引用错误。

挂起var语句(和函数声明),以便可以使用函数中的任何位置读取用这些方法声明的变量。

作业不挂起。 在赋值之前,无法读取通过赋值隐式创建的全局变量(通常认为这不是最佳实践,并且在严格模式下被禁止)。

由于我的评论似乎有助于向您解释,因此我将其转变为答案:

不会隐式创建全局变量(当您实际上没有声明它,而只是分配给它时)。 变量创建是在分配发生时内联发生的。

因此,当您尝试读取变量时,它尚不存在,这是一个错误。

varlet声明被提升到其适当范围的顶部。


所有这些都有望帮助解释为什么您应该仅在strict模式下运行,在这种模式下,隐式全局创建是非法的,不允许这样做,并且会立即引发错误。 基本上是邪恶的。 当您真正想要一个变量时,简单的错字拼写错误可能不会触发错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM