zoukankan      html  css  js  c++  java
  • JavaScript 作用域

    function foo(a) {
        b = 1;
        console.log( a + b );    
    }
    console.log(b); //Uncaught ReferenceError: b is not defined
    foo( 2 ); 
    console.log(b);//1

    印象中不知道在哪里看到过一个说法,在函数内部,有var和没var声明的变量是不一样的。有var声明的是局部变量,没var的,声明的全局变量,所以可以借此向外暴露接口。 

    今天发现我对这个理解不够全面透彻。

    var a = 'hello World';
    function bb(){
     a = 'hello Bill';
     console.log(a);  
    }
    bb()      //'hello Bill'
    console.log(a);  //'hello Bill'
    (function() { 
        testa(); // 打印出testa 
        testb(); // 报错:提示testb is not a function 
        console.log(testc); //undefined,如果移到上面就可以了 
        function testa() { 
            console.log("testa"); 
        } 
        var testb = function() { 
            console.log("tesb"); 
        } 
        var testc = "testc"; 
    })();    

     在《你不知道的javascript(上)》关于作用域的章节,提到了两个概念:LHS和RHS。

    作用域是一套规则,用于确定在何处以及如何查找变量。

    查找目的是对变量进行赋值,就会使用LHS查询。

    如果是获取变量的值,就会使用RHS查询。

    =号操作符、或者调用函数时传入参数的操作,都会导致关联作用域的赋值操作。这是LHS查询。

    不成功的RHS引用会抛出reference error异常。不成功的LHS引用,在非严格模式下,会自动隐式地创建一个全局变量,该变量使用LHS引用的目标作为标识符。在严格模式下,抛出referenceError。

    关于全局变量。

    全局变量会自动成为全局对象(比如浏览器中的window对象)的属性,因此可以不直接通过全局对象的词法名称,而是间接通过对全局对象属性的引用来对其进行访问。

    通过这种技术,可以访问那些被同名变量所遮蔽的全局变量。但非全局的变量如果被遮蔽了,无论如何都无法被访问到。

    window.a
  • 相关阅读:
    【NOIP2013提高组T3】货车运输-最大生成树+倍增LCA
    【POJ1986】Distance Queries-LCA算法
    【POJ1986】Distance Queries-LCA算法
    【HDU2874】Connections between cities-LCA算法
    【HDU2874】Connections between cities-LCA算法
    【HDU2586】How far away?-LCA算法模板题
    js ajax调用请求
    js ajax调用请求
    ThinkPHP 3.1.2 视图 2
    ThinkPHP 3.1.2 视图 2
  • 原文地址:https://www.cnblogs.com/dodocie/p/6855589.html
Copyright © 2011-2022 走看看