js变量提升

ES5中,JavaScript只能通过函数来创建词法作用域(不是动态作用域)

词法作用域就是代码写完,作用域就已经构建好了,如下面的案例一

案例一

var num = 10;
function test(){
    console.log(num);
}

function test1(){
    var num = 100;
    test();
}
    
test1(); // 10

案例二中该怎么解释一定要执行test()才不会报错呢,不是应该像案例一那样在函数执行前就已经进行了变量提升了吗

案例二

console.log(a);

function test() {
     a = 1;
}
test(); // 必须执行才能打印undefined 否则报错 
阅读 2.7k
2 个回答

案例二你可以这么理解:
//因提升所以test函数置顶
function test() {
a = 1;
}
//但是此时还没调用test,所以a还没赋值
console.log(a);//err

//接着才执行test(),此时a才赋值,但是该行为为赋值而不是声明;

test();//a为1

没执行的话, a是没有定义的,所以会报错啊。 这边你test这个函数的作用就是定义一个 a,
你没执行的话,a就没有定义。

就和你造了一把刀一样,你不拿他来砍人,那个人是不会因为你造了一把刀就受伤的。

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