JavaScript__作用域

摘取:
http://www.cnblogs.com/rainman/archive/2009/04/28/1445687.html
http://www.w3cplus.com/javascript/the-basics-of-variable-scope-in-javascript.html
**
在JavaScript中,常常把定义在函数外的变量称为全局变量
而在函数内声明的变量称为局部变量
当JavaScript执行时,都会有一个对应的执行环境被创建,执行环境中很重要的一部分就是函数的调用对象
而调用对象就是用来存储相应函数的局部变量的对象。每一个JavaScript方法都是在自己独有的执行环境中运行。
简而言之,函数的执行环境包含了调用对象,调用对象的属性就是函数的局部变量,每个函数就是在这样的执行环境中执行,
而在函数之外的代码,也在一个环境中执行,这个执行环境包含了全局变量

  • JavaScript 作用链
        ```


    • JavaScript没有块级作用域。
    
    

    变量i、j、k作用域是相同的,他们在整个rain函数体内都是全局

    块级作用域:

    任何一对花括号中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为 块级作用域,块级是不会产生作用域的,只有函数才会创建新的作用域


    • 4、函数中声明的变量在整个函数中都有定义。
    ```
    上面得代码说明了,变量x在整个rain函数体内都可以使用,并可以重新赋值。由于这条规则,会产生“匪夷所思”的结果,观察下面的代码。
    ```javascript
    ```
       ## `由于在函数rain内局部变量x在整个函数体内都有定义( var x= 'rain-man',进行了声明),所以在整个 rain函数体内隐藏了同名的全局变量x。这里之所以会弹出'undefined'是因为,第一个执行alert(x)时,局部变量  x仍未被初始化`
    
      所以上面的rain函数等同于下面的函数:
    ```javascript
    function rain(){
        var x;
        alert( x );
        x = 'rain-man';
        alert( x );
    }
    

    • 5、未使用var关键字定义的变量都是全局变量。
      variable = 'global';
    function checkVariable() { 
      variable = 'local'; 
    console.log(variable); // local
     myVariable = 'local';
     console.log(myVariable); // local
    }
    checkVariable();
    console.log(variable); // local
    console.log(myVariable); // local
    

    在全局作用域中声明变量可以省略var关键字,但如果在函数体内声明变量时不使用var关键字,变量就会变成全局变量。
    声明局部变量一定要使用var关键字,使用var关键字声明变量时,变量会自动添加到距离最近的可用环境中。
    如果没有写var, 变量就会暴露在全局上下文中, 这样很可能会和现有变量冲突. 另外, 如果没有加上, 很难明确该变量的作用域是什么, 变量也很可能像在局部作用域中, 很轻易地泄漏到 Document 或者 Window 中, 所以务必用var去声明变量。如果变量在未声明的情况下被初始化,该变量会自动添加到全局环境。


    • 6、全局变量都是window对象的属性
    ```
    等同于下面的代码
    ```javascript
    ```
    
    ***
    * ###延长作用链
    摘取:[http://blog.csdn.net/aidandai/article/details/46674277](http://blog.csdn.net/aidandai/article/details/46674277)
    `严格模式下,with语句不可用`
    ```javascript
       var oMyself = {
       sFirstname: "Aidan",
       sLastName: "Dai"
    }
    function create(){ 
    var sLastName = "Wen";
     with(oMyself){ 
    //将oMyself作为自己的执行环境 
    sAllName = sFirstname +" " + sLastName;
     }
     return sAllName;
    }
    var sMyName = create();
    console.log(sMyName); //Aidan Dai
    
    var oMyself = { 
    sFirstname: "Aidan"
    }
    function create(){
     var sLastName = "Wen";
     with(oMyself){
     //将oMyself作为自己的执行环境
     sAllName = sFirstname +" " + sLastName; 
    }
     return sAllName;
    }
    var sMyName = create();
    console.log(sMyName); //Aidan Wen
    

你可能感兴趣的:(JavaScript__作用域)