扫码关注官方订阅号
var foo = 1; function bar () { if (!foo) { var foo = 10; } console.log(foo); } bar(); var foo = 1;
为什么if里面的变量foo会提升到bar的顶端?if里面不是一个作用域吗?
欢迎选择我的课程,让我们一起见证您的进步~~
这么说吧. javascript只有三种作用域:
全局作用域
function 制造的作用域
with 制造的作用域
这个问题牵扯到作用域/作用域链 和 JS变量声明提前;JS变量声明提前:变量声明会提前到对应作用域的最前面执行;ES6中有块级作用域声明 let;var foo = 10;其实是两个步骤var foo;foo=10;,并且var foo;变量声明会先于此作用域的其他代码执行;
let
var foo = 10;
var foo;foo=10;
var foo;
这就是为什么下面这段代码
console.log(a); var a=1;
js不报错,并打印出来的值是undefined;
undefined
你问题中代码的执行顺序其实是
var foo = 1; function bar () { var foo; if (!foo) { //foo为undefined foo = 10; } console.log(foo); } bar(); var foo = 1;
js里只有函数是作用域,没有块级作用域。
使用 let 声明的变量在这种情况才有块级作用域
bar如果没有 他会往上继续去找 直到找到最顶层。
bar
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
这么说吧. javascript只有三种作用域:
全局作用域
function 制造的作用域
with 制造的作用域
这个问题牵扯到作用域/作用域链 和 JS变量声明提前;
JS变量声明提前:变量声明会提前到对应作用域的最前面执行;
ES6中有块级作用域声明
let;var foo = 10;其实是两个步骤var foo;foo=10;,并且var foo;变量声明会先于此作用域的其他代码执行;这就是为什么下面这段代码
js不报错,并打印出来的值是
undefined;你问题中代码的执行顺序其实是
js里只有函数是作用域,没有块级作用域。
使用 let 声明的变量在这种情况才有块级作用域
bar如果没有 他会往上继续去找 直到找到最顶层。