[英]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
语句(和函数声明),以便可以使用函数中的任何位置读取用这些方法声明的变量。
作业不挂起。 在赋值之前,无法读取通过赋值隐式创建的全局变量(通常认为这不是最佳实践,并且在严格模式下被禁止)。
由于我的评论似乎有助于向您解释,因此我将其转变为答案:
不会隐式创建全局变量(当您实际上没有声明它,而只是分配给它时)。 变量创建是在分配发生时内联发生的。
因此,当您尝试读取变量时,它尚不存在,这是一个错误。
var
或let
声明被提升到其适当范围的顶部。
所有这些都有望帮助解释为什么您应该仅在strict
模式下运行,在这种模式下,隐式全局创建是非法的,不允许这样做,并且会立即引发错误。 基本上是邪恶的。 当您真正想要一个变量时,简单的错字拼写错误可能不会触发错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.