了解以下javascript代码

了解以下javascript代码,javascript,Javascript,我遇到了以下javascript。我不理解代码执行的流程 var val = 'ap'; function func() { if (!val) { var val = 'ple'; } console.log(val); } func(); console.log(val); 我认为输出应该是'ap',然后是'ap'。 但我得到了“ple”和“ap”。 这是如何发生的?下一行中的变量val var val = 'ple' 正在被提升到功能的顶部 v

我遇到了以下javascript。我不理解代码执行的流程

var val = 'ap';

function func() {
    if (!val) {
        var val = 'ple';
    }
    console.log(val);
}
func();
console.log(val);
我认为输出应该是'ap',然后是'ap'。 但我得到了“ple”和“ap”。
这是如何发生的?

下一行中的变量
val

var val = 'ple'
正在被提升到功能的顶部

val
s(函数内部)值为
undefined
,这是错误的,这就是为什么
if
条件成功的原因,因为
!false
true
,因此函数中的
val
被设置为
'ple'
。看起来大致上像

function func()
   var val; // val = undefined
   if(!val) {  // it's still undefined and !undefined is true
      val = 'ple'; // so this code executes
   }
   console.log(val); // 'ple'
}
记住javascript中的作用域不是块作用域。相反,您要做的是设置已声明的
val

val = 'ple';

Javascript有函数作用域,在我们得到ES6中的let语句之前不会阻塞作用域…

如果是变量提升的情况,为什么输出是“ple”和“ap”。输出应该是“ple”,“ple”?@Kush
func
首先被调用,然后
console.log(val)
ok,那么您的意思是在顶部声明和定义的val对func()不可见?现在我明白了。是的。。某种程度上。。函数内部的
val
掩盖了函数外部的
val虽然它是错误的,但您可以使用
window.val
而不是函数内部的
val
,您必须了解第一个
val
的范围是
window
类,第二个
val
的范围是
func()