• js作用域链以及全局变量和局部变量


    > [带var]
    > 在当前作用于中声明了一个变量,如果当前是全局作用域,也相当于给全局作用域设置了一个属性叫做a
    ```javascript
    //=>变量提升:var a; <=>window.a=undefined;
    console.log(a);//undefined
    var a = 12;
    console.log(a);//12
    console.log(window.a);//window['a']在‘全局作用域’中,我们声明了一个变量,相当于全局对象window增加了一个属性名
    ```

    > [不带var]
    > 在全局作用域中,如果不带var,仅仅是给全局对象设置了一个新的属性名(把window.省略了)
    ```javascript
    // console.log(a);//=>Uncaught ReferenceError: a is not defined
    a = 12;//<=>window.a=12
    console.log(a);//=>12
    console.log(window.a);//=>12
    ```

    window.setInterval();//window.可以省略
    window.document.getElementById();//window.可以省略

    > 项目中,如果你的目的是创建变量,最好不要省略var,这样会严谨一些

    ### 作用域链
    > 函数执行形成一个私有的作用域(保护私有变量),进入到私有作用域中,首先变量提升(声明过的变量是私有的),接下来代码执行
    > 1、执行的时候遇到一个变量,如果这个变量是私有的,那么按照私有变量处理即可;
    ```javascript
    function fn() {
    //=>私有作用域
    //变量提升:var a;(私有变量)
    console.log(a);//->undefined
    var a = 12;
    console.log(a);//->12
    }
    fn();
    console.log(a);//->Uncaught ReferenceError: a is not defined 闭包机制:私有作用域保护里面的私有变量不收外界的干扰不收外界的干扰

    ```
    > 2、如果当前这个变量不是私有的,我们需要向它的上级作用域进行查找,上级如果也没有,则继续向上查找,一直找到window全局作用域为止,我们把这种查找机制叫做**`作用域链`**
    > 1)如果上级作用域有,我们当前操作的都是上级作用域中的变量(假如我们在当前作用域把值改了,相当于把上级作用域中的这个值给修改了)
    > 2)如果上级作用域中没有这个变量(找到window也没有);
    > 变量 = 值:相当于给window设置了一个属性,以后再操作window下就有了
     
    例子:
    //=>变量提升:var x;var y; fn=>aaafff111
    console.log(x, y);
    var x = 10,
    y = 20;
    function fn() {
    //=>[私有作用域]
    //=>变量提升:var x;(x是私有变量)
    console.log(x, y);//=>undefined 20
    var x = y = 100;//=>x=100(私有)y=>100(全局)
    console.log(x, y);//=>100 100
    }
    fn();
    console.log(x, y);//=>10 100
     
    结果:
    undefined undefined
    undefined 20
    100 100
    10 100
     
    注意事项:
    // var x = 10,y=10;等同于 var x = 10;var y =10;

    // var x = y = 100;
    // var x = 100;(私有)
    // y = 100;//->此处的y是不带var的(全局)


    ```javascript
    function fn(){
    a = 12;
    console.log(a);//->12
    }
    fn();
    console.log(a);//->12
    ```
  • 相关阅读:
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia
    BZOJ5177 : [Jsoi2013]贪心的导游
    BZOJ1482 : [Balkan2017]Cats
    BZOJ5207 : [Jsoi2017]隧道
    XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix
    线性代数笔记28——复矩阵和快速傅立叶变换
    闲话复数(2)——欧拉公式
    线性代数笔记27——对称矩阵及正定性
    闲话复数(1) | 不现实的虚数 i 为什么虚?它长成什么样?
    资源下载 | 深度学习、机器学习、机器学习实战、统计学习方法、高等数学、线性代数
  • 原文地址:https://www.cnblogs.com/kpengfang/p/9865683.html
Copyright © 2020-2023  润新知