var a = 10;
(function () {
console.log(a);
a = 5;
console.log(window.a);
var a = 20;
console.log(a);
})()
// 因为函数体中 存在 var a = 20 ; 所以函数体内容等价于如下代码
(function () {
var a ; // 此时a为undefined
console.log(a); // 输入为undefined
a = 5; // 给局部作用域 a 赋值
console.log(window.a); // 这里访问的是全局作用域中的变量 a
a = 20; // 给局部作用域 a 赋值
console.log(a); // 20
})()
变量提升:函数及变量的声明都将被提升到函数的最顶部
函数体中局部作用域是可以访问外部全局作用域的
全局作用域是无法访问函数体中的局部作用域的
注意:
变量提升只提升变量,对初始化的值不做提升,依然在原位置不动
全局变量的 this 默认指向 window
函数表达式是先提升变量,后在原来位置赋值
fn();
var fn = function(){console.log(1);};
//实际上
var fn //提升变量
fn() // fn is not a function
fn = function(){console.log(1)} //原来的位置