作用域 预解析: 生成作用域的时候,才会有预解析,预解析就是变量提升 全局作用域 是什么: JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性 全局变量有哪些: 不在函数内定义的变量,也是全局变量 函数是全局变量,并绑定到window对象 函数内没有用var声明的变量,也是全局变量 var course = 'Learn JavaScript'; alert(course); // 'Learn JavaScript' alert(window.course); 局部作用域 函数内的变量 let的背景 我们在for循环等语句块中是无法定义具有局部作用域的变量的: 为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量 function foo() { for (var i=0; i<100; i++) { // } i += 100; // 仍然可以引用变量i } function foo() { var sum = 0; for (let i=0; i<100; i++) { sum += i; } // SyntaxError: i += 1; } 变量查找机制 任何变量(函数也视为变量),如果没有在当前函数作用域中找到,就会继续往上查找,最后如果在全局作用域中也没有找到,则报ReferenceError错误。 名字空间 全局变量会绑定到window上,不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现。 减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中,把自己的代码全部放入唯一的名字空间MYAPP中,会大大减少全局变量冲突的可能 // 唯一的全局变量MYAPP: var MYAPP = {}; // 其他变量: MYAPP.name = 'myapp'; MYAPP.version = 1.0; // 其他函数: MYAPP.foo = function () { return 'foo'; };