zoukankan      html  css  js  c++  java
  • 作用域、作用域链理解

    javascript 作用域、作用域链理解

     

    JavaScript作用域就是变量和函数的可访问范围。

    1.变量作用域

       在JavaScript中,变量作用域分为全局作用域和局部作用域。

        全局作用域

          任何地方都可以定义拥有全局作用域的变量

          1.没有用var声明的变量(除去函数的参数)都具有全局作用域,成为全局变量,所以声明局部变量必须要用var

          2.window的所有属性都具有全局作用域

          3.最外层函数体外声明的变量也具有全局作用域 

    复制代码
     var globalScope="globalScope";
            function checkScope(){
                var partScope="part";
                scope="scope";
            }
            checkScope();
            console.log(globalScope);//globalScope,全局变量
            console.log(scope);        //scope,全局变量
            console.log(partScope);//Uncaught ReferenceError: partScope is not defined,报错:没有定义partScope
    复制代码

        局部作用域

          1.函数体内用var声明的变量具有局部作用域,成为局部变量

          2.函数的参数也具有局部作用域   

    复制代码
    var globalScope="globalScope";
    
            function checkScope(x){
                scope="scope"; //变成了全局变量
                var partScope="part";//在函数体内,声明局部变量一定要加var
                var globalScope="partScope";
            }
            checkScope(12);
            console.log(globalScope);//globalScope,在函数体内,局部变量的优先级高于全局变量
            console.log(scope);//scope,全局变量 console.log(partScope);
            console.log(partScope);// Uncaught ReferenceError: partScope is not defined,局部变量外面访问不到
            console.log(x);//局部变量外面访问不到
    复制代码

      总结:在函数体内局部变量的优先级高于同名的全局变量,声明局部变量必须用var

     2.函数作用域

     一些类C语言是块级作用域(block scope),每一个花括号是一个作用域,花括号内的代码对外是不可见的。而

    JavaScript是函数作用域(function scope),没有块级作用域。无论函数体内的变量在什么地方声明,对整个函数都是可见的,即JavaScript函数里声明的所有变量都被提前到函数体的顶部,只是提前变量声明,变量的赋值还是保留在原位置

     函数作用域只能用函数来声明独立作用域,并不是每一个花括号都是一个独立作用域,例如:for循环并不能创建一个局部的作用域

    复制代码
     for(var i=0;i<5;i++){
                var scope='scope';
            }
     console.log(i) //5;i仍然存在,因为JavaScript是函数作用域而不是块级作用域
     console.log(scope);//scope;scope仍然存在
    
     function checkScope(){
                console.log(funScope); // undefined,函数里声明的所有变量都被提前到函数体的顶部,所以funScope才会认为已经存在
                var funScope="funScope";
            }
    checkScope();
    复制代码

     3.作用域链  

     作用域链:JavaScript的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是全局对象的属性,所以这些对象的关系可以看作是一条链, 
    链头就是变量所处的对象,链尾就是全局对象

    function checkScope(scope){          
        var funScope="funScope";
    var s=scope;
    }

    在查找变量funScope的值时,会先查找当前对象,如果当前对象查不到就继续查找作用域链上面的下一个对象,如果作用域链上没有一个对象包含此属性,就抛出引用错误。

    在不包含嵌套的函数体内,作用域链上有两个对象:

     1.定义函数参数和局部变量的对象

     2.全局对象

    在包含嵌套的函数体内,作用域链上至少有三个对象

  • 相关阅读:
    hdu-2841 Visible Trees---容斥定理
    hdu-4135 Co-prime---容斥定理经典&&求1-m中与n互质的数目
    hdu-1796 How many integers can you find---容斥定理
    hdu-2837 Calculation---指数循环节
    FZU-1759 Super A^B mod C---欧拉降幂&指数循环节
    指数循环节&欧拉降幂
    hdu-3074 Multiply game---线段树+单点更新
    hdu-1792 A New Change Problem---数论&剩余系
    POJ-2429 GCD & LCM Inverse---给出gcd和lcm求原来两个数
    hdu-2685 I won't tell you this is about number theory---gcd和快速幂的性质
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4204654.html
Copyright © 2011-2022 走看看