无法理解此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,但我相信,这种行为的标准术语是,而不是“结婚”。)@泰德霍普,你说得绝对正确。你知道我昨天坐在这里盯着它看,肯定它看起来不对劲,但我无法确定它是什么。现在编辑它,谢谢!