//js解析的过程:
//1、寻找声明(全局作用域)
// var x;
// function a(){}
//2、执行
// x = 5;
// a();————>执行到a函数的过程中再重新进行以上两步
// (1)、寻找声明 var x;(函数作用域)
// (2)、执行:
// alert(x);这个x在函数作用域中存在,并且还没执行到赋值的那一步,那么弹出的东西就是undefined;
// x=10;
// alert(x) 这里的输出是全局变量并且已经赋值 5;
var x = 5;
a();
function a(){
alert(x);//undefind
var x = 10;
}
alert(x);//5
a()
function a(){
alert(x);//undefind
var x = 10;
}
alert(x);//报错,未定义
//先声明函数a,里面的输出在声明之后赋值之前,所以输出undefind;
//第二个输出因为在全局中没有声明,所以是未定义错误
alert(a)//函数块本身
function a() {
alert("函数")
}
var a = 1;
alert(a)//1
//先声明函数a,一个是函数a,一个是变量a,因为function比var声明的权重高,所以第一个输出就是函数a本身的代码块
//第二个输出是在变量a赋值的后面,所以自上而下的执行的话,这里输出1;
var a = 5;
function fn() {
alert(a)//5
}
fn()
//===================================
解析过程
1.寻找声明
var a;
function fn(){}
2.执行
a = 5;
fn()--------------------------------------> 函数
1.找声明
2.执行
alert(a); 他这里没有a 所以去找爸爸要。 a = 5; 所以弹窗是 5
所以最后结果为 弹窗5
下面看一下爸爸会不会去找儿子要东西
//====================================
function fn(){
var b = 5;
return b;
}
fn();
alert(b);//报错,未定义
//======================================
1.寻找声明
function fn(){}
2. 执行
fn()----------------------------------------> 函数
1.寻找声明
1.var b;
2.执行
return b;
alert(b); //我们看一下返回值是多少 b is not defined 他说b没有被定义,说明父作用域不可以向自作用域去寻找变量。
fn()
alert(a)//1
var a = 0;
alert(a);//0
function fn(){
a = 1;//变量提升,没有用var声明,归到window下面
}