采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
function foo() {
console.log(a); // 3 (不是 2!)
}
function bar() {
var a = 3;
foo();
var a = 2;
bar();
这块的材料有问题,我研究下出处和词法作用域,稍后更正,多谢反馈哈
怎么还没有更正呢?
这个已经在电子书中移除,具体的视频还在制作中
这里我的理解是,foo是全局声明的函数,引擎执行时如果在foo内部作用域找不到变量,会去全局找。可以参考下面两段代码,就不难理解了~
个人理解:
JS的解析过程分为两个阶段:预编译期(预处理、预解析、预编译)与执行期。
第一步:找一些东西.(代码还没有执行。预览页面之前,写完之后) 找程序中var关键字,如果找到了提前给var定义的变量赋值undefined 找程序中的普通函数,如果找到了,函数提升,将整个函数赋值给函数名。 如果找的var的名字和函数名字相同,函数优先。 第二步: 逐行解析代码。按照上下顺序。如果碰到函数定义,忽略。 重点:函数内部同样适用于js预解析。
第一步:预解析function foo(){ console.log(a) }function bar(){ var a = undefined foo()}var a = undefinedbar()第二步逐行解析代码function foo(){ console.log(a) (解析第五步),此刻a=2(全局变量)}function bar(){ var a = 3 (解析第三步) foo() (解析第四步)}var a = 2 (解析第一步)bar() (解析第二步)
谢谢,我觉得这个应该执行执行上下栈来解释会不会更清楚一些,我看的有点懵
取自课外阅读 第二篇 JavaScript深入之词法作用域和动态作用域
var value = 1; function foo() { console.log(value); } function bar() { var value = 2; foo(); } bar(); // 结果是 ???
假设JavaScript采用静态作用域,让我们分析下执行过程:
执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。
假设JavaScript采用动态作用域,让我们分析下执行过程:
执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。
前面我们已经说了,JavaScript采用的是静态作用域,所以这个例子的结果是 1。
谢谢,我查的资料也是这样的,我一开始用作用域链去理解这个但是我把作用域链中的父级的概念搞错了
登录后可查看更多问答,登录/注册
前端无门槛学习,从ES6到ES10,一套课程掌握JS最新语法
989 8
1.4k 7
1.1k 6