javascript的词法作用域

function foo() {
    console.log(b)
}
var b = 2;
foo(); //2

为什么这里输出的是2, 是和词法作用域有关吗?

阅读 1.9k
5 个回答

关键字: LHS RHS

var b;
function foo() {
    console.log(b)
}
b = 2;
foo(); //  console.log(b) 函数作用域是否有b -> 没有往上找 -> 全局作用域是否有b -> 有 -> 当前值是多少 2

更新:

js 在执行前就会解析代码,此时就声明并赋值了所有变量,然后才会开始执行。

也就是说,是先把所有变量都准备好,再按代码的顺序来执行。

只要用了 var,那么在当前作用域(及以下作用域中),该变量都是早早就准备好了的,它被赋值的时机早于任何对它的调用行为。


关键字:var 变量提升

变量声明是提升的
这里相当于调用之前变量已经声明了(并赋值了)

我说的话不是很清晰~ 补充一下
过程就是
声明提升 此时为未定义
在你调用之前执行了赋值语句 (赋值是在调用之前的)

变量声明是提升,再执行foo函数,合理的顺序;
如果将var b = 2;放在foo();后面,打印结果为undefined

var变量提升

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题