• 隐式全局变量,var a=1,b=1;与var a=b=1;的区别


    var a=1,b=1;与var a=b=1;在工作中第一种写法比较常见,但是我们偶尔也图方便用到第二种写法,以前以为他们表达的语义是一样的,实际操作中发现不太一样,上例子说明:

    1 console.log(a, b);
    2 var a = 1, b = 1;
    3 function fn() {
    4     console.log(a, b);
    5     var a = b = 2;
    6     console.log(a, b);
    7 }
    8 fn();
    9 console.log(a, b);

    看到上面一段代码,有一点开发经验的可能会脱口而出,从上至下:

    undefined  undefined

    undefined  undefined

    2  2

    1  1

    很明显,既然这样问了,这个答案就不准确

    变量提升:当栈内存(作用域)形成,JS代码自上而下执行之前,浏览器首先会把所有带 var/function关键词的进行提前 声明 或者 定义 ,这种预先处理机制称之为 变量提升

    声明:var a (此时a=undefined)

    定义:a=2(没有声明,所以放在哪里都是全局变量)

    var:只声明未定义

    funtion:声明和赋值都完成了

    变量提升只发生在当前作用域,开始加载页面的时候全局作用域是当前作用域,所以只会对全局作用域下的进行提升,因为变量提升是发生在当前作用域,因为此时函数是私有作用域,没有任何提升行为,函数中的代码只是存储的字符串而已

    在全局作用域下声明(var)的函数或者变量是全局变量,同理,在私有作用域下声明(var)的变量是私有变量 , 带var/function的才是声明,例如在私有作用域(函数)中,如果不带var,就是未声明,就会往上级作用域链查找,如果全局有,就是全局变量了,如果window没有这个属性(变量),就会给window设置一个属性window.a = 2;
    1 a = 2;
    2 console.log(window.a);//=>2

    此时a是全局变量,所以a === window.a,不加var意味在全局定义一个属性,也就是引出了要讨论的隐式全局变量

    var a=1,b=1;  等价于  var a=1;var b=1;

    var a=b=1;  等价于  var a=1;b=1;

    此时我们大概理解了上面两句赋值语句的不同,var a=b=1;这句,b没有var,那它就是全局变量

    由此,最上面的代码的答案我们应该可以知晓:

    undefined  undefined
    undefined  1
    2  2
    1  2

    参考地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/var

  • 相关阅读:
    java继承
    c#中委托和事件区别
    c#委托中的匿名方法和lambda表达式
    c#中内置委托
    iOS消息推送获取不到deviceToken解决方案
    python+appium+iOS自动化测试case如何写?
    Xcode查看iOS崩溃与崩溃日志分析
    iOS性能检测工具instrunments简单介绍
    python实现使用代码进行代理配置
    python+locust性能测试-最简单的登录点击次数
  • 原文地址:https://www.cnblogs.com/lhjfly/p/11806744.html
Copyright © 2020-2023  润新知