js的解析--预处理(三)
js的解析与执行过程 分全局 {预处理阶段和执行阶段} 函数{预处理函数和执行阶段}
1/创建词法环境(环境上下文)
LexicalEnvironment === window
{
}
用声明的方式创建的函数还会被加到词法环境中:
1。用var 定义的变量
比如定义了var a=5
function xxx(){}
2。var g = function () {}//函数表达式
在词法环境中就会有:a:undefined xxx : 对函数的一个引用
f();
g();
function f(){}
var g = function () {}
执行时:f可以执行。g报错(不是使用的声明的方式创建的,在预处理的阶段是undefaule,所以报错)
3。处理函数声明右冲突,会覆盖
处理变量时右冲突,会覆盖
alert(f);
function f() {console.log('111')};
var f=5;
alert(f);
var f=5;
function f() {console.log('111')};
都是输出function f() {console.log('111')}; 结论就是:函数是一等公民
例子:
alert(a);
//alert(b); 报错
alert(f);
alert(g);
var a = 5;
b = 6;
alert(b);
function f() { console.log ('f')};
var g = function g() { console.log ('g')};
alert(g);
undefault
function f() { console.log ('f')};
undefault
6
function g() { console.log ('g')}
4/在函数的预处理阶段,每调用一次,产生一个词法环境,其他跟全局一样
function f(a,b)
{
alert(a);
alert(b);
var b = 100;
function a(){}
}
f(1,2);
=>funtion =>2
5/如果没有用var声明的变量,会被成为最外部LexicalEnvirment成员
function f1(){
function f2 (){
b = 100;
}
f2();
}
f1()
window.b
=>100