了解以下javascript代码
我遇到了以下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
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()
类