为了账号安全,请及时绑定邮箱和手机立即绑定

js在函数中 创建变量 和 引用变量 实质上的执行过程是怎么样的?

js在函数中 创建变量 和 引用变量 实质上的执行过程是怎么样的?

慕的地10843 2018-10-20 14:05:43
刚开始学习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个赞

  1. 变量的查找分为LHS和RHS,当需要一个变量存储东西时使用的是LHS,当需要一个具体的值时使用的是RHS
    例如:num = 123,对num就是进行LHS查找,console.log(num),对num使用的是RHS查找

  2. 上面的所有的查找都是沿着作用域链从上往下查找,在当前作用域没有找到时,会到上层作用域查找。

var num = 123;function f1() {    console.log( num );
}function f2() {
    num = 456;
    f1();
}
f2();console.log(num);

  1. 变量提升:声明了num,f1,f2

  2. 初始化 num = 123

  3. 执行f2:创建f2的作用域链,沿作用域链查找num,在f2的作用域中没有找到,去外部作用域查找,找到了,执行num = 456

  4. 运行f1:查找f1函数,在f2的作用域中没有,到外部作用域中有,执行。在f1中需要RHS查找num,同样在全局作用域找到的

  5. 运行最后一行的console.log(num)


而你的第二个,就是在函数作用域中找到了num


查看完整回答
反对 回复 2018-11-17
  • 1 回答
  • 0 关注
  • 583 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号