二、如何获得真正的局部作用域呢?一个写法引起了我的注意 大家也许看过JQuery的源码或者Ext的源码,也许会对下面的写法有点熟悉。 复制代码 代码如下: var a = 3,b=4; var exports = (function() { var a = 1,b=2; return {a:a,b:b}; })(); console.log(""+a+","+b); console.log(exports.a+","+exports.b);
输出结果: ReferenceError: a is not defined 输出结果: undefined 复制代码 代码如下: var exports = (function() { var a = 1,b=2; return {a:a,b:b}; })(); console.log(a);
输出结果: ReferenceError: a is not defined 猜想结论: 每次JavaScript引擎执行代码时,会先扫描作用域中的所有代码(作用域中的function内部的代码不会扫描),并将所有var声明的变量记录下来,在代码执行到赋值之前,这些变量的值为undefined。此后如果访问变量时,先访问局部变量,如果没有这个局部变量就访问上一层的局部变量(如为闭包,上一层为闭包创建环境),直到访问到完全局变量。如果都没有这个变量,那么抛出异常。