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

 

posted @ 2017-05-15 15:18  kiera  阅读(138)  评论(0编辑  收藏  举报