刚开始学习js 对于Js的执行过程有很大的疑虑创建和引用 是否 是完全不同的概念 下面贴出了自己的实验代码和猜测 想请问各位 自己的猜测是否正确 如果是错的 那么到底是如何的一个过程呢?全局变量是不是一块公共的区域 里面有着一块块的变量?var num = 123;function f1() { console.log( num );}function f2() { num = 456; f1();}f2();console.log(num);//首先执行f2 看见一个全局变量num 他得去全局变量的区域内找找有没有 有就覆盖修改 没有就创建 找到了 在外面 虽然他用var 但并没有fn包含他 所以也是全局变量 修改他 之后f1输出为456var num = 123;function f1() { console.log( num+"f1" );}function f2() { var num = 456; f1(num); console.log(num+"f2");}f2();//猜测 运行到F2的时候 因为声明的是局部变量 首先在自己的函数域内查找 num 没找到 那么就创建在函数域内创建一个num 为 456//所以二者的差别就在于 一个去外面找了 找到了修改他 而另外一个呢 没有去外面找自己创建了一个//在创建的情况下 他会在根据变量的类型 在公共全局变量里寻找是否有已经定义的变量 有>修改 无>创建// 如果是局部变量 在自己的函数域内去创建 or 修改//但是变量的引用不一样 如果找到了>使用他 没找到>通过函数链 去上一级寻找//所以在引用和创建的时候 他的行为是不同的
1 回答

慕运维8079593
TA贡献1876条经验 获得超5个赞
变量的查找分为LHS和RHS,当需要一个变量存储东西时使用的是LHS,当需要一个具体的值时使用的是RHS
例如:num = 123,对num就是进行LHS查找,console.log(num),对num使用的是RHS查找上面的所有的查找都是沿着作用域链从上往下查找,在当前作用域没有找到时,会到上层作用域查找。
var num = 123;function f1() { console.log( num ); }function f2() { num = 456; f1(); } f2();console.log(num);
变量提升:声明了num,f1,f2
初始化 num = 123
执行f2:创建f2的作用域链,沿作用域链查找num,在f2的作用域中没有找到,去外部作用域查找,找到了,执行num = 456
运行f1:查找f1函数,在f2的作用域中没有,到外部作用域中有,执行。在f1中需要RHS查找num,同样在全局作用域找到的
运行最后一行的console.log(num)
而你的第二个,就是在函数作用域中找到了num
添加回答
举报
0/150
提交
取消