function t() {
console.log(str); /*此时内部已经有了AO对象 undefined*/
var str="local"; /*执行到此的时候如果AO对象没有赋值就赋值*/
console.log(str)
}
t()
/*
函数作用域是在声明的时候决定的而不是在执行的时候决定的
作用域链
作用域
t保护 p
外层作用域windows
作用链
p没有去t找。t没有去windows找
函数作用域在函数申明的时候决定
二,词法分析
函数执行前,会进行预编译,这个就是词法分析。会在解释器内部会
形成一个活动对象,AO
1,分析函数的参数
2,分析函数的变量声明
3,分析函数的函数声明
1,分析函数的参数
如果没有参数,AO对象上没有任何属性
AO.str=undefined
2,分析函数的变量声明
AO.str=undefined 词法分析的时候是undefind
3,分析函数声明表达式
AO.str=function
执行的过程是在AO对象上去找。
分析实例:
function t(age) {
console.log(age); /*undefined*/
var age=99; /*undefined*/
console.log(age);
function age() { /*age=function */
}
console.log(age)
};
t(5)
/*
执行之前词法分析
1,函数参数undefined
AO.age=function
2,分区函数变量声明
如果有值不做处理。没有值赋值
AO.age=undefiond
3,函数声明表达式
AO.age=funtion
执行过程先从自己的AO里面找。
第一步
AO.age=function 输出function
第二步
AO.age=99 输出99
第三部
如果没有赋值赋值,如果赋值了会再次赋值
AO.age=99 输出99