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

为什么x在内部范围中没有定义?[副本]

邹英悟
2023-03-14

在下面的代码

var x = 1;

(function () {
  console.log(x);
  var x = 2;
}());

为什么当console.log(x)时,x是未定义的?

共有2个答案

沈畅
2023-03-14

由于编译器的原因,即使您在代码下面启动了一个var,编译器也会将它发送到最上面,就像var x;,所以它在运行console.log之前首先作为未定义的“x”启动,这就是为什么在函数中首先初始化要使用的所有var是一个很好的做法,这样就不会发生这些错误。

孟建木
2023-03-14

可变吊装。实际的代码是这样执行的。

var x = 1;
(function() {
    var x; // x = undefined
    console.log(x);
    x = 2;
})();

编辑:根据李斯特先生的建议,关于可变吊装的一点。来自MDN(https://developer.mozilla.org/en-us/docs/web/javascript/referen/statements/var):

变量声明,无论发生在何处,都将在执行任何代码之前处理。用var声明的变量的作用域是其当前执行上下文,该上下文要么是封闭函数,要么是全局的,对于在任何函数之外声明的变量。

 类似资料:
  • 我先试过这个- 很好用。现在我用胖箭做了同样的事情。在这种情况下,“this”是未定义的。

  • 问题内容: Ada,Pascal和许多其他语言都支持范围,这是对整数进行子类型的一种方式。范围是一个有符号整数值,范围从一个值(第一个)到另一个值(最后一个)。实现一个在OOP中执行相同操作的类很容易,但是我认为本机支持该功能可以使编译器进行其他静态检查。 我知道无法静态地验证范围内定义的变量不会“溢出”运行时(即由于输入错误),但是我认为可以做些什么。我考虑了按合同设计方法(Eiffel)和Sp

  • 如果我有一个Web应用程序,它的应用程序上下文加载了我的webapp和所有作业配置文件的所有内容,如果我的作业中有一个没有范围="步骤"的简单ItemReader,那么阅读器是单例的,对吗?所以如果我通过SimpleJobLauncher从控制器启动两次作业,我会使用同一个bean,对吗?除非我放入范围="步骤",以便每个作业执行一个bean? 另一方面,如果我从CommandLineJobRun

  • 我有以下html: 我试图获得如下范围: 但我收到:。 我是angularJS初学者,我只是不明白为什么这不起作用。 更新:这也不起作用: 更新2:我试图在控制台中打印出作用域的所有代码:

  • 我正在尝试使用JS SDK在Dropbox上上传一个文件。下面是我试图调用函数的html代码: 这是定义函数的文件 但是,由于我不知道的原因,我的函数不能被调用。我得到错误“referenceerror:Dropupload is not defined”,我不知道这是否与问题有关,但我得到另一个错误:“syntaxerror:import declarations may only at top

  • 问题内容: 以下方法不起作用,因为内部块声明的变量与外部块中的变量同名。显然,变量属于声明它们的方法或类,而不属于声明它们的块,因此,我无法编写一个简短的临时临时块进行调试,而恰好将外部作用域中的变量压入阴影只是片刻: 我使用过的几乎每种块范围语言都支持此功能,包括我在学校为解释器和编译器编写的琐碎小语言。Perl可以做到这一点,Scheme甚至C都可以做到。甚至PL / SQL也支持这一点! J