JavaScript变量提升机制
Js代码执行前(栈内存)还做了一件事那就是变量提升,Js会在所有var function等关键字的提前声明或者定义。、
看以下的代码:
console.log(a); //undefined
var x = 5;
变量a虽然是在console.log后面定义的,但是使用var申明的a会提前保存在内存中,并赋值undefined ,然后再从上往下执行js语句 。它的执行顺序类似于下面的结构:
var x;
console.log(x); //undefined
x = 5;
先声明了a,a没有定义赋值为undefined ,输出的结果自然为undefined 然后再给a赋值为5。
再看以下代码:
console.log(x); //error: x is not defined
x = 5;
变量提升阶段 var 只声明未定义
变量提升前先赋值 然后执行代码
而带function的声明和赋值都完成了,看如下的代码:
console.log(f);
function f() {console.log("xx")}
声明函数会把整个函数都提升到最前面 ,所以浏览器中结果会输出整个函数,结果如下:
function f() {
console.log("xx");
}
函数的参数也可以理解为函数作用域的变量 ,如下:
var x = 5;
function f() {console.log(x); //undefined var x = 2;}
f();
以上虽然全局作用域声明了一个变量x ,但是函数里面也声明了一个变量x ,所以会先查找函数里面是否有变量x,如果有的话就不会再全局下查找了。
类似于如下结构:
var x = 5;
function f() { var x console.log(x); //undefined x = 2; }
f();
但注意:变量提升只发生在当前作用域
全局作用域声明的是全局变量
私有作用域声明的变量是“私有变量”
执行到函数时因为变量提升已经赋值和定义 直接执行=>形成私有作用域 变量提升