1.javascript在执行一个代码段之前,都会进行这些“准备工作”来生成执行上下文
image.png
在全局下,没有参数,所以就没有下边的第一项,
看下边的例子:
image.png
解析:函数执行时,
a)先填充函数的参数,得到 x且得到值10,y:undefined;z:undefined,
b)函数声明,function x(){},且覆盖了原来的x:10,
再看下边的例子
解析: a)先填充参数,x:undefined;y:undefined;z:undefined; b)函数申明,在vo对象里有了function fn(){}; c)变量声明,因为变量fn和之前的函数名一样,所以此处的fn变量被忽略。
执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境。
当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文
环境。处于活动状态的执行上下文环境只有一个。
其实这是一个压栈出栈的过程——执行上下文栈。如下图:
看代码演示
[内容摘自]http://www.cnblogs.com/wangfupeng1988/p/3989357.html
情况一:
function fn(){
var a=x=y=1;
}
// console.log(a)//报错
console.log(x)//报错
因为变量在函数内部声明,没有调用函数,所以.....
情况二:
function fn(){
var a=x=y=1;
}
fn()
// console.log(a) //报错
console.log(x) //1
情况三:
var x =1;y=0;z=0
function add(x){x=x+1}
y=add(x);
function add(x){x=x+3}
z=add(x);
//函数没有返回值,所以....
console.log(y)//undifined
console.log(z)//undifined
情况四:
var x =1;y=0;z=0
function add(x){x=x+1;return x}
y=add(x);
function add(x){x=x+3;return x}
z=add(x);
console.log(y)//4
console.log(z)//4
因为:
function add(x){x=x+3;return x}
var x =1;y=0;z=0
y=add(x);
z=add(x);
console.log(y)
console.log(z)
情况五:
console.log(a);//函数,函数和变量声明提前,此结果说明函数声明比变量更先;
var a =3;
function a(){
console.log(a)//不执行,函数没调用
var a= 3;
}
console.log(a);//3