Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法理解此javascript代码的输出_Javascript - Fatal编程技术网

无法理解此javascript代码的输出

无法理解此javascript代码的输出,javascript,Javascript,为什么以下代码打印未定义的代码?同样,在删除if块后,它将hello there打印为输出 var message = "hello there!"; function hello(){ console.log(message); if (true) { var message = "wassup?!"; } } hello(); 当定义与全局变量同名的局部变量时,会发生这种情况。由于函数范围内有一条var消息,因此它只会引用本地消息,而不是全局消息。因为当时没有给它

为什么以下代码打印未定义的代码?同样,在删除
if
块后,它将
hello there
打印为输出

var message = "hello there!";

function hello(){
  console.log(message);

  if (true) {
    var message = "wassup?!";
  }
}

hello();

当定义与全局变量同名的局部变量时,会发生这种情况。由于函数范围内有一条
var消息
,因此它只会引用本地
消息
,而不是全局消息。因为当时没有给它赋值,所以它是未定义的。请注意,如果将其移动到
if
后面,则它将是
“wassup?!”


解决方案是,您可能不想创建局部变量。因此,将
var message=“wassup?!”
更改为
message=“wassup?!”

定义与全局变量同名的局部变量时会发生这种情况。由于函数范围内有一条
var消息
,因此它只会引用本地
消息
,而不是全局消息。因为当时没有给它赋值,所以它是未定义的。请注意,如果将其移动到
if
后面,则它将是
“wassup?!”

解决方案是,您可能不想创建局部变量。因此,将
var message=“wassup?!”
更改为
message=“wassup?!”
这称为提升。起自(加强调):

变量声明,无论它们出现在哪里,都会在执行任何代码之前进行处理。用
var
声明的变量的作用域是其当前执行上下文,该上下文是封闭函数,或者对于在任何函数之外声明的变量,是全局的

if
块中声明的
var消息
隐藏了函数中所有代码的全局
消息
变量,包括对
console.log()的调用

另外两点。首先,JavaScript将变量声明与变量初始化分离。这就是为什么当执行
console.log(message)
时,本地
message
变量有一个未定义的值,而不是
“wassup?!”
。其次,因为提升是一种违反直觉的行为(至少对于习惯于其他语言的程序员而言),所以大多数JavaScript linting工具都会警告您不在执行上下文开头的
var
语句。我强烈建议您找到一个linting工具(想到JSLint、JSHint、ESLint和JSCS)并使用它。

它被称为提升。起自(加强调):

变量声明,无论它们出现在哪里,都会在执行任何代码之前进行处理。用
var
声明的变量的作用域是其当前执行上下文,该上下文是封闭函数,或者对于在任何函数之外声明的变量,是全局的

if
块中声明的
var消息
隐藏了函数中所有代码的全局
消息
变量,包括对
console.log()的调用


另外两点。首先,JavaScript将变量声明与变量初始化分离。这就是为什么当执行
console.log(message)
时,本地
message
变量有一个未定义的值,而不是
“wassup?!”
。其次,因为提升是一种违反直觉的行为(至少对于习惯于其他语言的程序员而言),所以大多数JavaScript linting工具都会警告您不在执行上下文开头的
var
语句。我强烈建议您找到一个linting工具(我想到的是JSLint、JSHint、ESLint和JSCS)并使用它。

要补充@Spencer Wieczorek的答案,变量定义被“提升”到其作用域的顶部,而变量赋值保持在您编写它的位置。因此,您提供的代码实际上是这样翻译的:

var message = "hello there!";

function hello(){
  var message;
  console.log(message);

  if (true) {
    message = "wassup?!";
  }
}

hello();
这更清楚地解释了为什么会看到这些结果-在调用
console.log()
之前,
message
变量是在
hello()
函数的范围内创建的,但它没有得到值
'wassup直到函数的后面


编辑:,正如@TedHopps在评论中指出的那样,它被称为提升,而不是“挂接”。

为了补充@Spencer Wieczorek的答案,变量定义被“提升”到其作用域的顶部,而变量赋值则保留在您编写它的位置。因此,您提供的代码实际上是这样翻译的:

var message = "hello there!";

function hello(){
  var message;
  console.log(message);

  if (true) {
    message = "wassup?!";
  }
}

hello();
这更清楚地解释了为什么会看到这些结果-在调用
console.log()
之前,
message
变量是在
hello()
函数的范围内创建的,但它没有得到值
'wassup直到函数的后面


编辑:,正如@TedHopps在评论中指出的,它被称为提升,而不是“挂接”。

+1,但我认为这种行为的标准术语是,而不是“挂接”。)@泰德霍普,你说得绝对正确。你知道我昨天坐在这里盯着它看,肯定它看起来不对劲,但我无法确定它是什么。现在编辑它,谢谢+1,但我相信,这种行为的标准术语是,而不是“结婚”。)@泰德霍普,你说得绝对正确。你知道我昨天坐在这里盯着它看,肯定它看起来不对劲,但我无法确定它是什么。现在编辑它,谢谢!