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